问题缘由,window下记事本保存为utf-8的时候,会添加BOM标识.这三个字节组成个不可见的字符.
在替换这个不可见字符的时候引申出来的问题.见代码String s = new String(new byte[]{
(byte)0xef,(byte)0xbb,(byte)0xbf,//不可见字符
(byte)0x61,//a
(byte)0xe4,(byte)0xb8,(byte)0xad,//中
(byte)0x62//b
},"utf-8");
System.out.println(s);
System.out.println(Arrays.toString(s.getBytes()));
s = s.replaceAll("\\x61", "");//可以把a替换掉
s = s.replaceAll("\\xe4\\xb8\\xad", "");//为什么替换不掉中字?
System.out.println(s);
System.out.println(Arrays.toString(s.getBytes()));
问题: 1 是否可以以及如何用\x hh 方式替换掉类似"中",bom标识等字符?
2 如果不可以,如何用正则替换(byte)0xef,(byte)0xbb,(byte)0xbf等不可见字符(只替换这三个字节).
3 感觉是因为0xef已经超过了byte表示的范围的原因.具体原因能帮解释一下么别的方法如果有也可以说说.
我的方法是 String bom = new String(new byte[]{(byte)0xef,(byte)0xbb,(byte)0xbf},"utf-8");
tar.replace(bom,"");

解决方案 »

  1.   

    http://hi.baidu.com/893625/blog/item/c5dbf9d158080c359b502715.html
    请参考别人写的
      

  2.   

    s = s.replaceAll("\\xe4\\xb8\\xad", "");//为什么替换不掉中字?Java 中是按字符来的,并不是按字节来的,你写的这个是一个字的 UTF-8 字节,不能用于替换汉字!
      

  3.   


    s = s.replaceAll("\\u4e2d", "");//替换中字
    s = s.replaceAll("\\ufeff", "");//替换UTF-8的BOM信息
    难道只能这样替换么?
    \xhh 带有十六进制值 0x 的字符 hh 感觉这个也可以,可这个难道确定真的不能替?
    \uhhhh 带有十六进制值 0x 的字符 hhhh 这个可以替换.
      

  4.   


     public Matcher matcher(CharSequence input) {
    if (!compiled) {
        synchronized(this) {
    if (!compiled)
        compile();
        }
    }
            Matcher m = new Matcher(this, input);
            return m;
        }大概了解了.替换的时候,是以CharSequence 来替换的.CharSequence 中已经不存在所谓的2进制,16进制了,被组成了字符了.
      

  5.   

    结果已经出来了.可以替换.
    接上,因为java是按char为单位替换,所以utf-8编码的时候,"中"字是一个char,替换的时候,只能用\u xxxx来替换,如果按字节.比如\xe4想替换掉utf-8中"中"字的第一字节是不可能的.但换个思路,可以把utf-8的编码来转成iso8859-1的编码,因为表示的编码有限,所以"中"字又被拆回了3个字节.这样就可以按字节替换了.测试代码如下:String s = new String(new byte[]{
    (byte)0xef,(byte)0xbb,(byte)0xbf,//不可见字符
    (byte)0x61,//a
    (byte)0xe4,(byte)0xb8,(byte)0xad,//中
    (byte)0x62//b
    },"utf-8");

    String tmp = new String(s.getBytes("utf-8"),"iso8859-1");
    tmp = tmp.replaceAll("\\xe4\\xb8\\xad", "");
    tmp = tmp.replaceAll("\\0357\\0273\\0277", "");
    System.out.println(Arrays.toString(tmp.getBytes("iso8859-1")));
    System.out.println(tmp);
      

  6.   

    在你欲替换的串中没有对应的\\xe4\\xb8\\xad各个字符,它也不会将它们三个按UTF-8来组合,所以等于没替换
    之所以替换了\\x61,是因为\xhh是正则表达式中的construct,被正则引擎解析为具有0xhh值的ascii字符(The character with hexadecimal value 0xhh)