UTF-8编码的特殊字符,在GBK下显示?的问题

在UTF-8编码里面存在一个特殊的字符,其编码是“0xC2 0xA0”,转换成字符的时候表现为一个半角空格,跟一般的半角空格(ASCII 0x20)不同的是它的宽度不会被压缩,所以排版中常能用到它。但是GB2312、Unicode之类并没有这样的字符,所以转换后会显示为“?”号,只是显示为问号而不是真正的问号,所以无法被替换。
这时需要在UTF-8的字符串中替换掉该字符即可,在java中的用法如下:
byte[] utfspace = new byte[] { (byte)0xc2, (byte)0xa0 };
String UTFSpace=new String(utfspace,"UTF-8");
intro=intro.replace(UTFSpace, " ");
=========================================================
上面说的只是空格,还有老外的名字中翻译后经常出现的中间点号,等待

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]", " ");

=======================

聪明的人解决问题,智慧的人避免问题。最好的解决方案应该是所有的应用层得编码统一用utf-8的,避免不同的编码转换。


【来源】http://sling2007.blog.163.com/blog/static/8473271320130214104104/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值