人在旅途 发表于 2006/5/17 14:31:00 | 文字列的编码有ASCII,JIS,国标,BIG5...一种语言常常有好几种编码,编程序的时候常常为码的转化而苦恼. 码的转化发生在文字列的输入和输出.要弄清这个问题首先要明白文字列的表现和存在.表现就是我们肉眼看到的形式,存在就是它的两进制流(无论你是用byte[]还是文件来保存,它都是两进制的格式)和这个两进制流的编码方式.光有两进制流还不够,系统要知道它的编码方式才能从相应字库里调出它的显示图片,这样你才能看到它的形式. 我们之所以觉得这个问题很麻烦是因为我们经常是只把这个两进制流保存了,而它的编码方式没有保存,而下次读进来的时候也没有指定它的编码方式.这是因为一个系统有她缺省的编码方式,如果你不指定就用她缺省的编码方式了.这在一个系统或缺省编码相同的系统之间是没问题,但是如果你的文字列要在不同缺省编码方式的系统之间共用(转送),而你还是不指定编码方式,那么发和收系统之间就是鸡对鸭讲,屏幕上就要显示乱码了. 比如日文有好几种编码,主要是JIS和EUC.JIS是WINDOWS的缺省编码,EUC是UNIX的缺省编码.如果你把一个在WINDOWS上保存的TEXT文件传到UNIX上,然后在UNIX上打开就是乱码了;反之,如果你把一个在UNIX上保存的TEXT文件传到WINDOWS,然后在WINDOWS上打开也是乱码了.所以为了正确的显示所传文件,发和收的一方必须做码变换.现在很多FTP软件就带有这种功能. 你在使用IE时,有时要用encoding菜单来切换,因为发现是乱码.但 现在的INTERNET的数据格式已经解决了这种两进制流和编码格式分离的情况,比如在HTML和XML格式中都可以指定编码格式,如果HTML中指定了编码格式,你就没必要用encoding菜单来切换了. 具体到编程上,在现在的操作系统上,一个String内保存的两进制数据流的编码是UNICODE.UNICODE是一种包容所有国家编码的格式,所以它被用在内存形式的文字列编码(String),但它的缺点是太大(是ASCII的4倍),所以它不被用在文件的保存和网上的传输.所以当你为了把String保存到硬盘文件或者通过SOCKET等传达其他系统,而把UNICODE格式的String变成byte[]时就需要指定变换后的编码格式或者使用系统缺省的格式来变换了.尤其是你没有指定编码格式而使用系统缺省编码格式来转变,而后又把它传输到另一个缺省编码不同的系统上,那么在那个系统接受到这个两进制流后就要把它从前一系统的统缺省编码格变换成UNICODE编码格式的String了.实践中常常是在你指定编码格式前,系统已经把它作为本系统的缺省编码格式来变换成UNICODE编码格式的String了.这时候,你只好先把这个UNICODE编码格式的String先变换成本系统的缺省略编码格式二进制流(byte[]),然后再把它作为前一系统的省略编码格式的二进制流(byte[])而变换成UNICODE编码格式的String. 记住,String里保有编码格式和两进制流,而byte[]中只有两进制流.
|