String str="排列3第09006期终端销售情况2009-1-6.txt";
playname=StringUtils.substring(str,0,StringUtils.indexOf(str, "第")).trim(); // 取到的值是排列3
System.out.println(playname);//输出的结果是?排列3这是为什么?为什么排列3前有一个隐藏的字符不可显示的,字符串是使用java.io.InputStreamReader is = new java.io.InputStreamReader(in,"utf-8");读进内存的。文件的编码方式是utf-8.

解决方案 »

  1.   

    查 了一下第一个字符的编码是值是65279,
    int(ch)=65279,65279是个什么样的字符呢
      

  2.   

    能看看引的是哪一个StringUtils包么?
    用org.apache.commons.lang.StringUtils包,显示的是正确的○( ̄︿ ̄)○
      

  3.   

    哎呀,直接跑的是上面的代码,所以没有"?"字符呢.
    如果字符串不是String str =而是读进来的,
    就先
    str = URLDecoder.decode(str, "UTF-8");
    解码一下看呢?
    65279的16形式似乎是一个bom.
      

  4.   

       是由于文件在保存的时候在前面加入了bom字符.    UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。但是在采用utf8方案的时候,请注意编辑器的自作聪明。
    比如editplus。
    原因就在于某些编辑器会往utf8文件中添加utf8标记(editplus称其为签名),它会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM),它的表示的是 Unicode 标记(BOM)。
    因此要解决这个问题的关键就是把这个标记选项去掉。
     
    首先用editplus打开这个文件,从Doucument菜单中选择Permanet Settings,有三个分类,分别是General,File, Tools.点击File,右边会有一项是 UTF-8 signature: 选择 always remove signature. 点击OK中文版本的 editplus 下操作的菜单结构如下: 文档->参数设置->文件->UTF-8签名->总是移除签名->确定