中文化和国际化问题权威解析之四:Java中文化和国际化攻略
来源:互联网 发布:linux cp 不覆盖 编辑:程序博客网 时间:2024/05/17 01:30
一般攻略
既然在Java内部是直接使用Unicode表示一切字符的,表达中文自然不成问题。因此所谓的中文问题并不是由Java本身引起的。而是因为对Java和Unicode理解不透或应用不当引起的。下面列出的原则,是解决一切中文问题的总纲:
- 在Java内部,正确使用Unicode标准。对于中文来说,每个汉字使用一个char表示。
- 在所有的输入输出环节,指明正确的编码方式,进行正确的字符到字节,或字节到字符的转换。
- 如果输入源或输出目标直接支持,尽可能直接使用Unicode进行输入输出。例如,Oracle数据库直接支持UTF-8的文本数据。使用UTF-8操作Oracle,可自动兼容所有的语言文字;反之,使用ISO-8859-1或者ASCII去操作Oracle,只能兼容欧美单字节的文字。
- 不要依赖平台默认的字符编码方式。例如,中文Windows下,默认编码为GBK,英文Linux下,默认编码为ISO-8859-1。依赖平台默认值意味着同样的程序在不同的平台上可能产生不同的结果。
遗留代码攻略
对于第三方的代码,或是以前遗留的代码,如果没有留有指定字符编码的接口,那么这些代码很可能使用默认的系统编码,或是使用固定的字符编码。这样很容易造成上述的各种中文乱码的问题。对于这些代码,我们可以做一个适配器,将它们返回的字符串转换成适当的Unicode内码。
例如,我们的数据库错误地使用了ASCII编码存储文本,也就是说从数据库返回的中文字,实际上被“拆”成了两个欧洲字符。但是数据库中已经保存了大量数据,想要把它改成正确的UTF-8存储格式并不容易。作为权宜之计,我们可以在数据访问层做一个适配器,将欧洲字符重新组合,变成真正的Unicode中文。
除了Unicode以外,无论何种本地字符集,都不能代表所有字符。这将导致一些问题: 我们知道浏览器是根据当前页面的content type中指定的字符编码来发送用户的表单输入的。假设当前页面的content type为text/html; charset=GBK,则当用户按下submit按钮提交表单时,浏览器自动将用户输入的字符以GBK方式编码并发回到服务器端。假设页面的content type为text/html; charset=BIG5,则用户的输入将以BIG5繁体中文的编码发送。但是,如果用户输入的字符超过了这个编码字符集的范围,会怎样呢?我们可以写一个简单的JSP做试验: 上述页面是用 可见浏览器会把超出当前字符集的字符,以实体编码的形式(如爱),直接返回给服务器端。Java servlet并不会自动处理这样的输入值,这给进一步处理字符串造成了困难。 为什么不直接使用UTF-8作为WEB页面的编码呢?这样不仅可以让全世界的文字同时显示在同一屏幕上(只要安装了相应的字体),也大大简化了解码用户表单的工作(不需要处理爱这样的实体编码)。但使用UTF-8也会带来一些微小的不便: 根据上面的讨论,我们得到如下最佳攻略: 1. 使用UTF-8作为WEB页面的编码。使用如下语句设置content type: 并且在 对于 Turbine 2. 仍然可以使用GBK来书写页面模板。对于以Velocity为模板系统的Turbine,需要在Turbine的配置文件中设置: 模板的内容将以 3. 使用UTF-8解码用户输入的表单。有几种方式可以达到这个目的: o 创建一个javax.servlet.Filter,在servlet被调用前,调用request.setCharacterEncoding方法: o 和WEB应用完全类似,使用Java Mail API同样需要设置正确的content type和字符编码。 值得注意的是, 大结论 完成同一个目标,往往有许多种途径,总有一些途径是比较好的,也有一些是不太好的。那些不太好的途径,虽然也能完成任务,却会导致很多潜在的问题。这些问题可能要在一定的条件下才能表现出来。例如,我们公司的Java程序以及Oracle数据库,从一开始就没有正确使用Unicode来存取文本,结果导致了一系列的问题。而要修正这样的问题,代价是比较大的。 怎样的途径是好的呢?一般来说,符合业界标准的,或是市场标准的实现途径,是我们首选的途径。所以我们设计任何程序之前,一定要充分了解相应的标准,不能不求甚解,完成任务了事。 Unicode标准及相关技术,不仅是解决中文问题的关键,而且是以统一的方法解决国际所有语言文字的问题的最好途径。使用好这些标准,必将为我们公司的产品的进一步向国际化发展,打好坚实的基础。
WEB应用攻略
- 中文化和国际化问题权威解析之四:Java中文化和国际化攻略
- 中文化和国际化问题权威解析之四:Java中文化和国际化攻略
- 中文化和国际化问题权威解析之四:Java中文化和国际化攻略
- 中文化和国际化问题权威解析之四:Java中文化和国际化攻略
- 中文化和国际化问题权威解析
- 中文化和国际化问题权威解析
- 中文化和国际化问题权威解析之二:Java国际化基础
- 中文化和国际化问题权威解析之二:Java国际化基础
- 中文化和国际化问题权威解析之二:Java国际化基础
- 中文化和国际化问题权威解析之二:Java国际化基础
- 中文化和国际化问题权威解析之三:Java中文问题分析
- 中文化和国际化问题权威解析之三:Java中文问题分析
- 中文化和国际化问题权威解析之三:Java中文问题分析
- 中文化和国际化问题权威解析之三:Java中文问题分析
- 中文化和国际化问题权威解析之五:URL编码/Misc
- 中文化和国际化问题权威解析之六:MIME编码/字符传输编码
- 中文化和国际化问题权威解析之七:JS中的escape、encodeURI、encodeURIComponent解惑
- 中文化和国际化问题权威解析之五:URL编码/Misc
- MySQL学习之路(九):MySQL状况监控
- 关于PE病毒编写的学习(九)——追加病毒的编写(上)
- 如何调出调试中的即时窗口?
- 思考mysql内核之初级系列1--- mysql的启动过程(摘自老杨)
- ASP.NET操作EXCEL时出现的错误 Retrieving the COM class factory for component with CLSID(转)
- 中文化和国际化问题权威解析之四:Java中文化和国际化攻略
- 利用Flying Saucer 和 iText 实现HTMl转PDF(java)
- 判断浏览器的类型
- BaseAdapter notifyDataSetChanged()
- 思考mysql内核之初级系列2---我可以为你服务什么?(摘自老杨)
- 电源通知 RequestPowerNotifications
- c# 十六进制字串 转 Byte数组
- 从GoogleMap的金字塔模型到无限级索引数据结构(一)
- 思考mysql内核之初级系列3---办理业务的流程(摘自老杨)