我从一文本文件根据文件编码读入数据,然后解析,放到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就没有问题,请问什么原因?如何保证不管文件是什么编码都不会错误?

解决方案 »

  1.   

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

  2.   

    如果你的sno1 和sno 都是ascii字符那就和编码没有关系
      

  3.   

    首先保证读取文本出来不是乱码,并且跟从数据库中读取出来是一样的。看看他们的hashcode是否一致
      

  4.   


    都是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编辑的文件,用记事本编辑的文件就没有问题。
      

  5.   

    嗯,看来是UltraEdit-32添加的多余的编码,直接把导出的文件导入,就没有前面的-124, 49, -107, 51.............
      

  6.   

    UE 存储的时候 类型问题 ,你用 UTF-8 编辑的文本带BOM了,选择不带BOM就OK了
      

  7.   


    果然,对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。
      

  8.   

    解决办法,读取一行后,先判断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);
    }