map的问题,其实还是编码的问题.......

wula0010 2011-10-26 04:33:27
我从一文本文件根据文件编码读入数据,然后解析,放到map里如下:

//判断文件编码
CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
detector.add(new ParsingDetector(false));
detector.add(JChardetFacade.getInstance());
detector.add(ASCIIDetector.getInstance());
detector.add(UnicodeDetector.getInstance());
java.nio.charset.Charset charset = null;
try {
charset = detector.detectCodepage(sourseFile.toURL());
} catch (Exception ex) {
ex.printStackTrace();
}
if (charset != null) {
chartsetName=charset.name();
} else {
chartsetName="UTF-8";
}
//读入文本文件
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(fileName),chartsetName));
while (in.ready()) {
str = in.readLine().trim();
if (str.trim().equals("")) {
break;
}
HashMap map=new HashMap();
//解析
String sno = str.substring(0, 16).trim();
.....
//放入map
backMap.put(sno, myObj);
}


然后,我从数据库里读取相关信息,得到sno1,

Obj objTmp=backMap.get(sno1);

这个时候,虽然sno1和当时put的sno一样,但是就是取不到obj,调试程序跟踪,没有发现乱码,sno字段,都是数字型的字符串,在调试是确实看到sno1和map里的一样,sno和sno1的前后空格都去掉了......
我的项目是utf-8,文本文件也是utf-8,如果我的文本文件换个编码,用记事本保存的时候选择asni就没有问题,请问什么原因?如何保证不管文件是什么编码都不会错误?
...全文
169 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wula0010 2011-10-28
  • 打赏
  • 举报
回复
解决办法,读取一行后,先判断Arrays.toString(sno .getBytes)的前面是否是-124, 49, -107, 51,如果是,先截取掉,再转换为字符串:

String sno = str.substring(0, 16).trim();
String snoBytes=Arrays.toString(sno.getBytes());
//测试文件保存是否带BOM标志
if(snoBytes.indexOf("-124, 49, -107, 51")>0){
sno=new String(sno.getBytes(),4,sno.getBytes().length-4);
}
wula0010 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 shaosijun2004 的回复:]
UE 存储的时候 类型问题 ,你用 UTF-8 编辑的文本带BOM了,选择不带BOM就OK了
[/Quote]

果然,对ue还是不熟悉:

BOM(Byte Order Mark),是UTF编码方案里用于标识编码的标准标记,这个标记是可选的,因为UTF8字节没有顺序,所以它可以被用来检测一个字节流是否是UTF-8编码的。微软在自己的UTF-8格式的文本文件之前加上了EF BB BF三个字节,Windows上面的UltraEdit/Notepad等程序就是根据这三个字节来确定一个文本文件是ASCII的还是UTF-8的,然而这个只是微软暗自作的标记,其它平台上并没有对UTF-8文本文件做个这样的标记。

查看是否有BOM的方法:用UltraEdit打开文件,切换到十六进制编辑模式(Ctrl + H),察看文件头部是否有EF BB BF。或者,用Windows的记事本打开,选择 “另存为”,看文件的默认编码是UTF-8还是ANSI,如果是ANSI则不带BOM。
小笨熊 2011-10-27
  • 打赏
  • 举报
回复
没遇到过。。。学习下
shaosijun2004 2011-10-27
  • 打赏
  • 举报
回复
UE 存储的时候 类型问题 ,你用 UTF-8 编辑的文本带BOM了,选择不带BOM就OK了
wula0010 2011-10-26
  • 打赏
  • 举报
回复
嗯,看来是UltraEdit-32添加的多余的编码,直接把导出的文件导入,就没有前面的-124, 49, -107, 51.............
wula0010 2011-10-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shaosijun2004 的回复:]
sno1 sno 都是ascii 字符么?

最简单的方式就是把的 Arrays.toString(sno1.getBytes)
和 Arrays.toString(sno .getBytes)
看一下,一目了然,有可以多了些不可见字符
[/Quote]

都是ascii字符,就是1234组成的,
Arrays.toString(sno1.getBytes)和Arrays.toString(sno .getBytes)确实不一样,
一个是"[-124, 49, -107, 51, 49, 48, 48, 50, 55]",一个是"[49, 48, 48, 50, 55]",后面一个正确,问题是"[-124, 49, -107, 51, 49, 48, 48, 50, 55]"这个前面的-124, 49, -107, 51是哪里来的?用记事本看不到乱码,我是用UltraEdit-32编辑的文件,用记事本编辑的文件就没有问题。
aotian16 2011-10-26
  • 打赏
  • 举报
回复
不了解, 关注下
2399 2011-10-26
  • 打赏
  • 举报
回复
首先保证读取文本出来不是乱码,并且跟从数据库中读取出来是一样的。看看他们的hashcode是否一致
shaosijun2004 2011-10-26
  • 打赏
  • 举报
回复
如果你的sno1 和sno 都是ascii字符那就和编码没有关系
shaosijun2004 2011-10-26
  • 打赏
  • 举报
回复
sno1 sno 都是ascii 字符么?

最简单的方式就是把的 Arrays.toString(sno1.getBytes)
和 Arrays.toString(sno .getBytes)
看一下,一目了然,有可以多了些不可见字符

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧