Java对特殊编码方式的处理

最近一直被一个编码的问题困扰着。写了一个把数据写成XML格式的小功能,结果,文件头编码方式用UTF-8,文件中的中文总是不能被正确解析,IE不行,JAXP也不行。JAVA就是用unicode的吗?为什么呢?文件头编码方式改成GB2312或者GBK就没有问题了。但是这不是我想要的答案。

昨天晚上在网上查查,大多数遇到此类问题的都说把编码方式改成GB2312或GBK,但是考虑到国际化怎么办,总不好每个语言版本都换一种编码方式吧。最后终于找到一个合适的解释。


经修订的 UTF-8

Java 平台对经修订的 UTF-8 已经很熟悉,但是,问题是应用程序开发人员在可能包含增补字符的文本和 UTF-8 之间进行转换时需要更加留神。需要特别注意的是,某些 J2SE 接口使用的编码与 UTF-8 相似但与其并不兼容。以前,此编码有时被称为“Java modified UTF-8”(经 Java 修订的 UTF-8)或(错误地)直接称为“UTF-8”。对于 J2SE 5.0,其说明文档正在更新,此编码将统称为“modified UTF-8”(经修订的 UTF-8)。

经修订的 UTF-8 和标准 UTF-8 之间之所以不兼容,其原因有两点。其一,经修订的 UTF-8 将字符 U+0000 表示为双字节序列 0xC0 0x80,而标准 UTF-8 使用单字节值 0x0。其二,经修订的 UTF-8 通过对其 UTF-16 表示法的两个代理代码单元单独进行编码表示增补字符 。每个代理代码单元由三个字节来表示,共有六个字节。而标准 UTF-8 使用单个四字节序列表示整个字符。

Java 虚拟机及其附带的接口(如 Java 本机接口、多种工具接口或 Java 类文件)在 java.io.DataInput 和 DataOutput 接口和类中使用经修订的 UTF-8 实现或使用这些接口和类 ,并进行序列化。Java 本机接口提供与经修订的 UTF-8 之间进行转换的例程。而标准 UTF-8 由 String 类、java.io.InputStreamReader 和 OutputStreamWriter 类、java.nio.charset 设施 (facility) 以及许多其上层的 API 提供支持。

由于经修订的 UTF-8 与标准的 UTF-8 不兼容,因此切勿同时使用这两种版本的编码。经修订的 UTF-8 只能与上述的 Java 接口配合使用。在任何其他情况下,尤其对于可能来自非基于 Java 平台的软件的或可能通过其编译的数据流,必须使用标准的 UTF-8。需要使用标准的 UTF-8 时,则不能使用 Java 本机接口例程与经修订的 UTF-8 进行转换。

以上的解释引自http://www.wespoke.com/archives/000825.html

今天早上回去查程序,果然我之前是用RandomAccessFile来写文件的,这个类的上层接口正是DataInput, DataOutput  。于是换作OutputStreamWriter 来写,用OutputStreamWriter(OutputStream out, String charsetName)  charsetName传"UTF-8",这次写出的XML文件用UTF-8编码格式就能被IE,JAXP,甚至EXCEL解析。根据JDK文档上的介绍用Writer out
   = new BufferedWriter(new OutputStreamWriter(System.out)); 可以提高效率。

编码问题对我来说还是很陌生的,现在遇到了也要多少了解一点。后来我尝试写.CSV文件也用UTF-8格式,结果用EXCEL打开的时候中文出现乱码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值