JAVA字符编码及欧元符系列(二)

在做项目的过程中,要把欧元符写入到结果文件,作为不同字段的分隔符。仅仅是这一个小问题,还真是难倒了我,花费了不少的时间,下面把我遇到的问题和处理的过程同大家分享,希望其他人在这方便少走弯路。

为了不误导大家,先说一下相关开发环境,因为字符编码的问题和环境的相关性非常大。

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



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值