字符编码那些事儿(UTF-8,GBK,Unicode,ASCII)(三)

字符解码错误是否是可逆的

我们讨论更加常见的乱码问题。

Web开发中经常会遇到乱码问题,对于初学者来说乱码问题非常恼人。以Java语言为例,如果我们通过Java抓取一个网页的文本,打印之后发现是乱码,我们能否通过String newStr = new String(oldStr.getBytes("oldcharset"), "newcharset")的方式得到正确的字符串?

Java String类使用的是Unicode编码方式,对于String类而言,我们可以认为Unicode是所有字符的终极表示形式,无论在创建字符串(比如String(byte[] bytes, Charset charset))的时候指定的是何种编码,Java语言都会将其转换为Unicode编码。盲目的指定charset会导致三种情况:

一、指定的编码是正确的,bytes数组中的码点能够准确无误的转换成原来的字符串。

二、指定的编码是错误的,但是bytes数组中的码点对于该charset都是有效的,即没有落到无效区域。那么我们也能够得到一个字符串,只不过字符跟原来不同了。

这时我们可以通过String newStr = new String(oldStr.getBytes("oldcharset"), "newcharset")的方式还原出原来的字符。

三、指定的编码是错误的,并且bytes数组中存在一些码点对于该charset是无效的,即这些码点对于该charset没有任何含义。对于无效的码点,会转换成UnicodeREPLACEMENT CHARACTERUnicode码点0xFFFD)。

这时我们是不能通过String newStr = new String(oldStr.getBytes("oldcharset"), "newcharset")的当时还原原来的字符的。

 

通过上面的讨论我们得出结论:

l  所有的文本或字符串都会有它相应的编码,只有使用正确的编码才能将字符串正确的显示。

l  由于REPLACEMENT CHARACTER的存在,通常情况下字符串解码错误是不可逆的。因此对于抓取网页文本出现乱码的情况,最好的解决办法就是在第一次解码的时候就选择正确的编码。

 

参考文献:

Unicode字符表:www.ssec.wisc.edu/~tomw/java/unicode.html

以上内容纯属个人臆测,切不可盲目相信,后果自负哦~

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值