Java去除utf-8类型的空格的⽅法
问题产⽣
空格字符串是什么最近遇到⼀个这样的问题,在⽣成的报⽂中,某个字段信息后⾯有⼀个空格,在代码中trim()下,它仍然存在。到底什么原因呢?
问题的根源
经过多番查证,是由于utf-8中的特俗字符造成的。
问题的根源,在于UTF-8这种编码⾥⾯,存在⼀个特殊的字符,其编码是“0xC2 0xA0”,转换成字符的时候,表现为⼀个空格,跟⼀般的半⾓空格(ASCII 0x20)⼀样,唯⼀的不同是它的宽度不会被压缩,因此⽐较多的被⽤于⽹页排版(如⾸⾏缩进之类)。⽽其他的编码⽅式如GB2312、Unicode之类并没有这样的字符,因此如果简单地进⾏编码转换,⽣成地GB2312/Unocode字符串中,这个字符就会被替换成为问号(ASCII ox3F)。
使⽤UTF-8进⾏HTMLDecode的时候,对于语句开头的( ),就会被⾃动转换成为这个特殊的空格,可能是判断为放在开头的空格,⼀定是⽤来排版的。在转换为其他编码之前,这个特殊的空格受到的待遇与普通的半⾓空格是⼀致的,甚⾄也会被trim()去掉。
因此,碰到这个问题的原因有两种:⼀种是在UTF-8编码下进⾏了转换,产⽣了这个字符;还有⼀种就是⽹页中直接采⽤了这个字符进⾏排版。
问题解决之法
C#代码如下:
byte[] space = new byte[]{0xc2,0xa0};
string UTFSpace = Encoding.GetEncoding("UTF-8").GetString(space);
HtmlStr = HtmlStr.Replace(UTFSpace," ");
Java版:
byte bytes[] = {(byte) 0xC2,(byte) 0xA0};
String UTFSpace = new String(bytes,"utf-8");
html = placeAll(UTFSpace, " ");
注意:需要强调的是,替换之前不能进⾏编码转换,⼀定要继续使⽤UTF-8编码。如果已经转换成其他编码,那么错误就已经不可逆转了。没有办法再区分这个错误的问号和正常的问号之间的差别了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论