朋友开发的时候遇到一个问题,在过服务代理的时候,代理把UTF-8的中文编码强制给做成GBK的了,于是就开始了漫长的UTF-8到GBK的编码。感觉上很简单,但是就是发现在中文正常的文本后多了个 'x00'的尾巴。不得其解。
从网上看到有人分析,感觉还是蛮正确的,于是引用过来推荐给了朋友。
引自 http://www.dongliu.net/blog/post?action=view&postid=155141
Unicode字符集现在有超过10万个字符,其BMP部分也有六万多个字符;而GBK字符集只有两万以前多个字符。这样的话,从支持unicode字符集或者unicode字符集BMP的编码方式,转化到GBK编码的时候,就会有编码落到GBK字符集以外,不能转化成GBK编码。在java中,转换之后的字符串,这部分字符都变成了’?’。
通常这些都是非常生僻的字符,倒是可以不考虑;但是有一个特殊的unicode字符,不在GBK字符集中。却频繁用于xml/html等格式的文件中。这个字符unicode序号为0xA0,utf-8编码结果为C2A0,作用是一个排版空格——普通的ascii空格在xml/html中是被忽略的。大量UTF-编码的网页使用这个字符用作占位的空格。而且似乎浏览器对它的处理方式也不同:IE8浏览器会认得这个空格,firefox3.6简单的把它替换成 。当把一个utf-8编码的网页转成gbk编码时,这个字符就变成讨厌的问号了。
处理方法,就是在字符串以GBK编码写出之前,把这个字符替换掉:
str = str.replace('/u00A0', ' ');
彻底而保险的方法是过滤所有GBK不能表示的字符:
str = str.replaceAll("[^/u4E00-/u9FA5/u3000-/u303F/uFF00-/uFFEF/u0000-/u007F/u201c-/u201d]", " ");