在做项目的过程中,要把欧元符写入到结果文件,作为不同字段的分隔符。仅仅是这一个小问题,还真是难倒了我,花费了不少的时间,下面把我遇到的问题和处理的过程同大家分享,希望其他人在这方便少走弯路。
为了不误导大家,先说一下相关开发环境,因为字符编码的问题和环境的相关性非常大。
IDE:myeclipse 10
OS:windows7
myeclipse的所有编码格式都为UTF-8
错误方法一:
直接写入欧元符字符串。
File file = new File("test.txt");
FileWriter writer = new FileWriter(file);
writer.write("€");
用UE打开文件,显示?,用十六进制方式查看为3F,这是java内部转码失败的表现。
错误方法二:
经过google搜索,说是欧元符的编码是128,不在基本ASCII编码表之内,就打算直接写入字节(0x80)
File file = new File("test.txt");
FileOutputStream writer = new FileOutputStream(file);
writer.write(0x80);
用UE打开结果文件,看到了期待已久的欧元符。但是这种方法在linux系统下失败,用vi查看时显示的是<80>,产生的文件编码格式为Latin-1,也就是ISO-8859-1。而在windows下用UE打开结果文件的默认编码格式为操作系统默认编码(GBK),关于ASCII编码、ISO-8859-1编码、GBK编码、windows 默认编码(基础为GBK)的区别,请参考我的下一篇文章。
下面再说说我的错误认识。
错误认识一:欧元符是ASCII的扩展字符。
因为互联网上很多人说欧元符的ASCII编码是128,即0x80,所以认为欧元符就是ASCII扩展编码的一部分,并且在windows下UE打开能够正常显示欧元符,所以写欧元符成功。
错误认识二:欧元符是ISO-8859-1编码的一部分,并且编码为:128(0x80)
ISO-8859-1是ASCII的扩展集,最多可以表示的字符为256个,但是欧元符却不属于ISO-8859-1,直到ISO-8859-15时才加入欧元符,编码为0xA4,所以在windows 下UE能够争产显示编码为0x80的欧元符是另有原因的。
在windows平台下,默认的字符编码集为CP936,产被视为GBK,这里需要注意,和GBK不是完全相同,真正的GBK标准比CP936多95个汉字。国标的GBK经过了好几个版本的升级换代,或添加或删除或修改了部分字符或汉字的编码,我们完全不用关心这些,因为在windows上执行的完全是CP936的标准,写的文件默认为CP936的编码。查询微软的cp936编码表得知,欧元符被编码在0x80的位置,所以文件内的0x80字节在windows下打开可以正常显示欧元符。
但是怎样才能写入无论windows还是linux都能正常显示的欧元符呢?
可以有两种方法:
方法一:"€".getBytes("utf-8")
方法二:new String("\u20AC").getBytes("utf-8")
http://zh.wikipedia.org/wiki/ISO/IEC_8859-1
http://zh.wikipedia.org/wiki/ISO/IEC_8859-15
http://msdn.microsoft.com/zh-cn/goglobal/cc305153.aspx
http://zh.wikipedia.org/wiki/GBK