1-1-16-1-18 关于中文问题,我也写点体会
发信人: myzdf (myzdf), 信区: Java标题: 关于中文问题,我也写点体会
发信站: BBS 水木清华站 (Wed Nov6 21:19:57 2002), 转信
我遇到过很多的中文问题,
比如往Oracle中插入中文,然后用TOAD来看,乱码
从Oracle中读出中文,打印到控制台,中文,
用JSP输出到IE,乱码
发手机短信,普通短信。乱码,
普通短信搞定,发免提短信,又是乱码,搞定后
手机上网,GPRS,wap1。0,wml ,开始都是乱码,
为了输出UCS2编码,我还特地从Acrobat reader
中找到了gb2312到ucs2的编码对应表
其实java中都有
后来做电子商务,同样有乱码的问题,
解决的办法是每次插入中文是都转码,
读出是在转码
现在做彩信,用ericsson的vasp api,
死活手机受到的都是乱码,
和ericsson联系,他们说技术人员在美国
暂时不好解决,估计老外也不行
只有反编译,修改他们的代码,才搞定
我觉得很多问题出在我们没有分清什么是编码,
什么是字符集。
这两个概念很多都是一样,但也有不同之处。
举个例子:在服务器上,FreeBSD or Solaris or Linux
系统采用的编码一般为iso-8859-1,
可以通过file.encoding=gb2312来改这个属性
如果某个文件中存有“你好”两个字
我们从文件中读出:
BufferedReader reader = new BufferedReader(new FileReader("hehe.txt"));
StringBuffer sb = new StringBuffer();
String s;
while((s = reader.readLine()) != null)
{
sb.append(s);
}
reader.close();
这样避免了从byte数组到String的转换,如果我们直接
读二进制文件,得到的就是原始数据(见下文)
然后:
char chars[] = sb.toString().toCharArray();
for(int i = 0 ; i < chars.length ; i++)
System.out.println(chars);
命令行:
java -cp . Test
输出的是四个乱码
java -Dfile.encoding=gb2312 -cp . Test
输出的是你好两个字
没有加-Dfile.encoding=gb2312情况,
我们得到的对象String s = sb.toString();
它保存的数据是原始数据"c4e3 bac3"映射到
字符集iso-8859-1上的映射,映射出来的四个字符我们都不认识,
这四个c4e3 bac3在不同的字符集上,表示不同的字符,
它映射在gb2312字符集上,对应的两个gb2312字符是"你好"
java中的String类提供了这样的转换:
public String(byte []bytes,String charset);
public byte[] getBytes();
public byte[] getBytes(String encoding);
其中 getBytes() 相当于直接调用 getBytes(System.getProperty("file.encoding"));
比如上面的对象s,我要将其转换为gb2312上的字符串,可如下:
byte bytes[] = s.getBytes("iso-885901");//得到原始数据c4e3 bac3
String s1 = new String(bytes,"gb2312");//将原始数据c4e3 bac3映射到gb2312上
这个时候s1才是Unicode的编码,可以用于传输到其他的平台或系统
到其他的系统,如果要正确显示,必须先获得原始数据c4e3 bac3,
然后映射到那个系统的字符集上。
比如我现在要显示s1,如果直接 调用
System.out.println(s1);
打出来的肯定为乱码,因为系统的字符集为iso-8859-1,而我们的s1现在
是映射在gb2312字符集上。
方法是:
byte bytes1[] = s2.getBytes("gb2312"); ///得到原始数据c4e3 bac3
String s3 = new String(bytes1,"iso-8859-1");///将原始数据c4e3 bac3映射到iso-8859-1上
现在在输出s3,看到的就是你好两个字了。
所以只有当原始数据映射到正确的字符集上,得到的String对象
才是Unicode的编码.
加-Dfile.encoding=gb2312情况,大家可以试一试。
如果不制定特殊的编码,应该不过出现上面的情况。
所以建议大家使用这种方法
但是很多情况我们是没有能力修改系统的字符集,
比如Oracle等,那我们只能学会第一种方法。
页:
[1]