在使用java的过程中,由于平台和国际化的需要,需要处理多种文字编码,这时很多乱码问题就来了,虽然每次都测试实验最后找到解决方案,但不知所以然,所以仔细学习了一下相关东西,加上自己的实践总结。
首先请访问一篇好文章: http://www.regexlab.com/zh/encoding.htm (字符,字节和编码,包括C++,Java相关讨论)
实践中问题以及思路:
将程序生成的html内容用getBytes("gb2312")得到字节流,用FileOutputStream写到磁盘(操作系统文件编码iso-8859-1)。按理来说,直接以字节流写出去,不会出转换的问题。但实际上用任何软件打开都是乱码。(如果操作系统文件编码gb2312不会出问题)
分析:问题在于任何软件尤其IE都根据操作系统文件编码进行了转换成自己使用的编码,所以反而出错了。
解决:用纯字节流写,即转化成iso-8859-1(唯一的和Unicode有映射单字节编码,而且从任何字节流转换都不会丢失数据,见前面推荐的文章)写到磁盘,无论操作系统是什么编码(如gb,jis等等),从磁盘读出来的数据都是纯字节流,没有丢失,其他软件再根据自己的方式转换成适当的编码就没有问题。
一个常见问题讨论:
http://topic.csdn.net/t/20051208/10/4445548.html
1,首先,我修改了xml文件的编码方式,改为“GBK”编码格式的xml;
<?xml version="1.0" encoding="GBK"?>
2, 在访问数据库的配置文件中,访问mysql的url 参数修改为:useUnicode=true&characterEncoding=GBK;
3,在我的Pageconfig的类修改取xml的xml.getBytes("ISO8859-1"));
InputStream st = new ByteArrayInputStream(xml.getBytes("ISO8859-1"));
这个我先前也曾经尝试过,但没有匹配成功;
4,需要修改mysql数据库的默认编码:
default-character-set=GBK
default-collation=GBK
5,关于以下的取值,不做任何转码;
ret.title =page.getAttributeValue("title");
6,因为我有一个专门最后生成wml页面的转码的类,将会转成utf-8格式;