关键词:linux java mutlibyte encoding locale i18n i10n 摘要:通过2个测试程序说明系统缺省编码方式和应用的编码策略对字符处理的影响,选择合适的编码处理策略,构建更符合国际化规范的通用应用。 |
为了了解JAVA应用的编码处理的机制,首先要了解操作系统对JVM缺省编码方式的影响,因此我做了一个Env.java,用于打印显示不同系统下JVM的属性和系统支持的LOCALE。程序很简单:
/* * Copyright (c) 2002 chedong@bigfoot.com * $Id: Env.java,v 1.1 2002/07/30 09:48:12 chedong Exp $ */ import java.util.*; import java.text.*; /** * 目的: * 显示环境变量和JVM的缺省属性 * 输入:无 * 输出: * 1 支持的LOCALE * 2 JVM的缺省属性 */ public class Env { /** * main entrance */ public static void main(String[] args) { System.out.println("Hello, it's: " + new Date()); //print available locales Locale list[] = DateFormat.getAvailableLocales(); System.out.println("======System available locales:======== "); for (int i = 0; i < list.length; i++) { System.out.println(list[i].toString() + " " +_ list[i].getDisplayName()); } //print JVM default properties System.out.println("======System property======== "); System.getProperties().list(System.out); } }
最需要注意的是JVM的file.encoding属性,这个属性确定了JVM的缺省的编码/解码方式:从而影响应用中所有字节流==>字符流的解码方式 字符流==>字节流的编码方式。
LINUX下的LOCALE可以通过 LANG=zh_CN; LC_ALL=zh_CN.GBK; export
LANG LC_ALL 设置。locale 命令可以显示系统当前的环境设置
Windows的LOCALE可以通过控制面板==>区域设置 设置实现
结论:
JVM的缺省编码方式由系统的LOCALE设置确定,所以当设置成相同的LOCALE时,Linux和Windows下的缺省编码方式是没有区别的(可以认为cp1252=ISO-8859-1都是一样的西文编码方式,只包含255以下的拉丁字符),因此测试2我只列出了LINUX下LOCALE分别设置成zh_CN和en_US测试结果输出和在WINDOWS下分别按照不同的区域设置试验的输出结果是一样的。