技术开发 频道

解析Java WEB中文乱码问题根源


    2.2. 另一个故事:把任意数据编码成其他ISO8859-1字符串
  
    如果某协议只能使用可打印的ISO8859-1字符串(编码为0-127的字符,即字母,数字等),而现在需要处理图片数据,或中文数据,那怎么办?比如原本的邮件传输协议,就是如此。

    这就出现了BASE64编码,简单的说,它总是把3个字节的数据,转换成4个字节来表示,而这每个字节,都是一个“可打印”的ISO8859-1字符。BASE64只使用64个字符,即字母,数字和加号,斜杠。根据使用的字符数量的不同,还有BASE85等编码。类似的情况,在别的应用领域还有其他编码。

    这些协议中最常见的,正是我们最“喜欢”的http。因为原本的http协议只能传递ISO8859-1字符串,所有的中文,不管是何种编码,都无法传递,其他任何双字节编码也一样。

    因此,http的url参数使用如下的形式:
    www.site.com/index.jsp?name=a&age=1&q=ÖÐÎÄ
ÖÐÎÄ “中”的GB2312码为十六进制的D6 D0,但是这两个字节根本无法放到http的协议中去,因此计算机用一个字符串来保存这些数据。把这两个字节用6个字符来表示:ÖÐ。接受方首先根据这个字符串还原字节数组D6 D0,加上知道使用的是GB2312码,就可以知道这6个字符代表的意思。

    又如,xml是纯粹的字符串文档,有很多符号都被语法本身所保留,如&
因此在xml文本中,一些字符需要用特殊的方式来表示,如&用&来代替。而更统一的方法,是用以下的形式
中文 表示“中文”
中文 同样表示“中文”,注意20013=x4e2d

    又如,JDK的native2ascii的运行结果(在java的properties文件中使用)
\u4e2d\u6587 表示“中文”

    让事情更糟的是,这些编码方式和前面的汉字编码并非相加的关系,而是相乘的关系,也就是说,可以用来编码GB2312的字符串,同样也可以用来编码Unicode的字符串。
    前面所列出的一些例子,分别是(文字都是“中文”):
    q=ÖÐÎÄ 
   “中文”的GB2312码 
    中文
   “中文”的Unicode码 0x4e 0x2d 0x65 0x87
    显然并没有谁规定这些方式只能编码Unicode或者UTF-8的数据,当然还可以是GB2312或者BIG5或者其他什么东西

0
相关文章