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