关于Java的字符编码问题
关于字符编码的概念及技巧
在基于 Java 语言的编程中,我们经常碰到汉字的处理及显示的问题。
Java 语言默认的编码方式是UNICODE ,它给JAVA带来了活力,及更广的适应性,但是问题也随之而来我们通常使用的文件和数据库一般都是基于 GB2312或者 BIG5 等方式编码的,怎样才能够恰当地选择汉字编码方式并正确地处理汉字的编码呢?
英文字符一般是以一个字节来表示的,最常用的编码方法是 ASCII 。但一个字节最多只能区分256个字符,而汉字成千上万,所以现在都以双字节来表示汉字,为了能够与英文字符分开,每个字节的最高位一定为1,这样双字节最多可以表示64K格字符。我们经常碰到的编码方式有GB2312、BIG5、UNICODE 等。关于具体编码方式的具体资料,有爱好的读者可以查阅相关资料。GB2312是国标码。两个字节中,第一个字节(高字节)的值为区号值加32(20H),第二个字节(低字节)的值为位号值加32(20H),用这两个值来表示一个汉字的编码。
UNICODE 码是微软提出的解决多国字符问题的多字节等长编码,它对英文字符采取前面加“0”字节的策略实现等长兼容。如 “A” 的 ASCII 码为0x41,UNICODE 就为0x00,0x41,利用非凡的工具各种编码之间可以互相转换。
我们经常碰到这样的情况:浏览基于 jsp 技术的网站看到的是乱码,文件打开后看到的也是乱码,这是因为 外部文件-> Java 字节码-> ;虚拟机->操作系统->显示设备” 这个转变过程有了问题。首先看一个JSP中的解决中文问题的例子,我想这段代码大家都很熟悉吧,
但他的具体含义是什么呢?为什么要这样做呢?
String s1 = request.getParameter(“keyWord”);
//从request中取参数 s1
byte[] bytes=s1.getBytes(“ISO-8859-1”);
//把s1(按Unicode->ISO-8859-1) 转回原来的byte[]。
String s2 = new String(bytes,”GBK”);
//因为原来的参数(或字符,字串)是GBK编码方式,所以把bytes
//按照GBK->Unicode的方式转码
为什么要这样做呢?因为接收的参数本来是GBK编码方式的,但是缺省的用了
iso-8859-1->Unicode 的转码方式把参数转成了String
所以肯定是乱码(中文时)
只要了解了这个基本道理,中文字符问题应该都能解决!