深入剖析jsp和servlet对中文的处理

来源:互联网 发布:手机网购秒杀软件 编辑:程序博客网 时间:2024/06/05 15:26

   世界上的各地区都有本地的语言。地区差异直接导致了语言环境的差异。在开发一个国际化程序的过程中,处理语言问题就显得很重要了。

  汉字是双字节的。所谓双字节是指一个双字要占用两个byte的位置(即16位),分别称为高位和低位。中国规定的汉字编码为gb2312,这是强制性的,目前几乎所有的能处理中文的应用程序都支持gb2312。gb2312包括了一二级汉字和9区符号,高位从0xa1到0xfe,低位也是从0xa1到0xfe,其中,汉字的编码范围为0xb0a1到0xf7fe。

  在不久的将来,中国会颁布另一种标准:gb18030-2000(gbk2k)。它收录了藏、蒙等少数民族的字型,从根本上解决了字位不足的问题。注意:它不再是定长的。其二字节部份与gbk兼容,四字节部分是扩充的字符、字形。它的首字节和第三字节从0x81到0xfe,二字节和第四字节从0x30到0x39。

  编码名称 说明
  ascii 7位,与ascii7相同
  iso8859-1 8-位,与 8859_1,iso-8859-1,iso_8859-1,latin1...等相同
  gb2312-80 16位,与gb2312,gb2312-1980,euc_cn,euccn,1381,cp1381, 1383, cp1383, iso2022cn,iso2022cn_gb...等相同
  gbk 与ms936相同,注意:区分大小写
  utf8 与utf-8相同
  gb18030 与cp1392、1392相同,目前支持的jdk很少

  举例说明。有gb2312中有一个汉字“李”,其编码为“c0ee”,欲转化为iso8859-1编码。步骤为:先把“李”字转化为unicode,得到“674e”,再把“674e”转化为iso8859-1字符。当然,这个映射不会成功,因为iso8859-1中根本就没有与“674e”对应的字符。

  例如:把字符流buf =“0x80 0x40 0xb0 0xa1”进行new string(buf, "gb2312")操作,得到的结果是“/ufffd/u554a”,再println出来,得到的结果将是“?啊”,因为“0x80 0x40”是gbk中的字符,在gb2312中没有。

  所以,在汉字转码时,如果发生错乱,得到的不一定都是问号噢!不过,错了终究是错了,50步和100步并没有质的差别。

原创粉丝点击