随笔-17  评论-6  文章-1  trackbacks-0

http://www.javaworld.com/javaworld/jw-04-2004/jw-0419-multibytes_p.html

多字节字符在J2EE中的处理
--多字节字符的J2EE开发

摘要
大多数J2EE服务器对多字节字符语言(中文和日文)支持的很好,但是不同的J2EE服务器和浏览器支持的方式不同。当开发者从一个服务器移植中文应用到另一个时,总是遇到多字节字符问题。在本文里,Wang Yu分析了产生此种问题的根本原因,并提供了一些解决方案和指导方针。

中文是世界上最复杂、最综合的语言之一。有时我很庆幸自己是中国人,尤其我看到我的外国朋友为学好中文特别是写汉字而奋斗的时候。但当开发J2EE本地化应用,却无法庆幸了。本文将告诉你为什么。
尽管java平台和大多数J2EE服务器很好的支持国际化,开发中文应用时我仍然遇到很多多字节字符问题:
编码和字符集之间的区别是什么?
为什么多字节字符应用在不同操作系统间有不同的显示?
为什么多字节字符应用在不同应用服务器间有不同的显示?
为什么多字节字符应用在不同浏览器间有不同的显示?
为什么大多数J2EE服务器不能很好的支持UTF-16(universal transformation format)编码。
本文将帮你解答这些疑问。

字符的基础知识
字符在计算机发明之前就已经存在了。3000多年以前,甲骨文出现在古代中国。这些字符有特有的形象和意思,大部分有名字和发音。所有这些方面构成字符集(character repertoire),一组特有语言的截然不同的字符,与计算机没有一点关系。过去的几千年里,创造出许多种语言和数千的字符。现在我们试着将这些字符编码成计算机能理解的1和0的串。
当用键盘打字时,你涉及字符输入方法。对于简单字符,存在字符和建码的一一对应。对于复杂语言,一个字符需要多个击键。
当你看到屏幕上字符之前,操作系统必须存储字符在内存。实际上,操作系统定义了字符和非负整数的一一对应,保存在内存中。这些整数被称为字符码(character code)。
字符能存储在文件中或通过网络传输。字符编码(character encoding )定义了如何映射一个字符的字符码到字节的序列。一些字符码映射到单字节,如ASCII,一些映射到多字节,如中文、日文,依赖于不同的字符编码。
不同的语言有不同的字符表,每一个字符表用特有的编码格式。通常,当选择了语言,就选择了对应的字符表、编码格式。比如,选择中文,默认就选择了GBK中文字符表和GBK编码格式。
我避免术语字符集(character set),因为它带来混淆,显然character set和character repertoire是同义词。Character set被HTTP Mime 头误用了,charset被误用做encoding。
Java的特性之一是16位的字符,支持Unicode,表示不同语言不同字符的标准方法。不幸的是,这种方法在J2EE开发中引起许多问题。
导致显示问题的不同开发阶段
J2EE开发包括几个阶段(图一);每一个阶段都能导致多字节字符显示问题。
编码阶段
编码时大多用IDE如JB、NetBeans,或编辑器如UE、vi。不管选择什么,如果在jsp、java、html文件中有多字节字符串,如果不小心就会遇到显示问题。

posted on 2005-10-18 13:40 小铁匠 阅读(354) 评论(0)  编辑  收藏 所属分类: java

只有注册用户登录后才能发表评论。


网站导航: