Java编程技术中汉字问题的分析及解决 - 编程入门网
treamReader isr = new InputStreamReader(fis, "GB2312");
Reader in = new BufferedReader(isr);
int ch;
while ((ch = in.read()) > -1) {
iCharNum += 1;
buffer.append((char)ch);
}
in.close();
return buffer.toString();
}
catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
?
编码转化的过程如下: GB2312------------------>Unicode------------->Big5 执行java gb2big5 gb.txt big5.txt ,如果gb.txt的内容是“今天星期三”,则得到的文件big5.txt中的字符能够正确显示;而如果gb.txt的内容是“情人节快乐”,则得到的文件big5.txt中对应于“节”和“乐”的字符都是符号“?”(0x3F),可见 sun.io.ByteToCharGB2312 和 sun.io.CharToByteBig5 这两个基本类并没有编好。 正如上例一样,Java的基本类也可能存在问题。由于国际化的工作并不是在国内完成的,所以在这些基本类发布之前,没有经过严格的测试,所以对中文字符的支持并不像 Java Soft 所声称的那样完美。前不久,我的一位技术上的朋友发信给我说,他终于找到了 Java Servlet中文问题的根源。两周以来,他一直为Java Servlet的中文问题所困扰,因为每面对一个含有中文字符的字符串都必须进行强制转换才能够得到正确的结果(这好象是大家公认的唯一的解决办法)。后来,他确实不想如此继续安分下去了,因为这样的事情确实不应该是高级程序员所要做的工作,他就找出Servlet 解码的源代码进行分析,因为他怀疑问题就出在解码这部分。经过四个小时的奋斗,他终于找到了问题的根源所在。原来他的怀疑是正确的,Servlet的解码部分完全没有考虑双字节,直接把 %XX 当作一个字符。(原来 Java Soft 也会犯这幺低级的错误!) 如果你对这个问题有兴趣或者遇到了同样的烦恼的话,你可以按照他的步骤对Servlet.jar 进行修改: 找到源代码 HttpUtils中的static private String parseName ,在返回前将 sb(StringBuffer) 复制成 byte bs[] ,然后return new String(bs,”GB2312”)。作上述修改后就需要自己解码了: HashTable form=HttpUtils .parseQueryString(request.getQueryString())或者 form=HttpUtils.parsePostData(……) 千万别忘了编译后放到 Servlet.jar 里面。 关于Java中文问题的总结 Java编程语言成长于网络世界,这就要求Java对多国字符有很好的支持。Java编程语言适应了计算的网络化的需求,为它能够在网络世界迅速成长奠定了坚实的基础。Java的缔造者 (Java Soft) 已经考虑到 Java编程语言对多国字符的支持,只是现在的解决方案有很多缺陷在里面,需要我们付诸一些补偿性的措施。而世界标准化组织也在努力把人类所有的文字统一在一种编码之中,其中一种方案是ISO10646 ,它用四个字节来表示一个字符。当然,在这种方案未被采用之前,还是希望 Java Soft 能够严格地测试它的产品,为用户带来更多的方便。 附一个用于从数据库和网络中取出中文乱码的处理函数,入参是有问题的字符串,出参是问题已经解决了的字符串。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |