字符解码错误是否是可逆的
我们讨论更加常见的乱码问题。
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没有任何含义。对于无效的码点,会转换成Unicode的REPLACEMENT CHARACTER(Unicode码点0xFFFD)。
这时我们是不能通过String newStr = new String(oldStr.getBytes("oldcharset"), "newcharset")的当时还原原来的字符的。
通过上面的讨论我们得出结论:
l 所有的文本或字符串都会有它相应的编码,只有使用正确的编码才能将字符串正确的显示。
l 由于REPLACEMENT CHARACTER的存在,通常情况下字符串解码错误是不可逆的。因此对于抓取网页文本出现乱码的情况,最好的解决办法就是在第一次解码的时候就选择正确的编码。
参考文献:
Unicode字符表:www.ssec.wisc.edu/~tomw/java/unicode.html
以上内容纯属个人臆测,切不可盲目相信,后果自负哦~