文选流氓 发表于 2003-2-7 23:48

1-1-16-1-4 Linux 下 Java 的中文问题


发信人: SuperMMX (笑天子*不再喝可乐), 信区: Java      
标题: Linux 下 Java 的中文问题
发信站: BBS 水木清华站 (Tue Jul 17 21:23:44 2001)

                                                                                       (p1 of 3)
                     Linux 下 Java 的中文问题解决方法

                                       By SuperMMX
      
    好象有许多人都碰到了这个问题, 我以前也碰到过, 在网上找了一些解决
方法看了看, 在自己的机器上试了试, 都没有解决问题, 趁着这几天把 Debian
的中文问题搞好了, 顺便把这个也弄一弄, 终于搞明白了一些东西. 错误之处
还请大家指教. 这里主要指的是 Swing 中显示的中文, 关于其他中文操作问题,
暂不作讨论.
    其实说起来 Java 的中文问题非常简单, 有两个重要因素, 一个是编译时
的编码(encoding), 另一个是字体. 这两个缺一不可.
    一, 编译时的编码: 指的是编译 Java 的源程序时指定的编码格式, 即使用

javac -encoding MyEncoding MyJavaFile.java
   
编译 MyJavaFile 时 -encoding 所指定的 MyEncoding. 通常中文的编码有
大陆和新加坡使用的 GB2312 以及 台湾和香港使用的 Big5, 普通英文用的是
ISO_8859_1. 这里只关注 GB2312. 如果在编译的命令行中指定了编码, 那么就
使用指定的编码格式, 如果没有指定, 将使用系统缺省的编码格式, 在 windows
的中文简体版下都是 GB2312, 而 Linux 下不同的终端可以有不同的编码, 可以
直接设置环境变量 LC_ALL LANG 等指定相应的不同类型信息的编码, 比如数字,
日期, 货币, 姓名等等. 可以用 locale 命令来看当前终端所有的编码. 在
Java 程序中可以使用 System.getProperty("file.encoding"); (注 1) 来获取
当前的编码格式. 好了, 当编译的时候, 源码中的中文字符串都会按照指定的
或者缺省的编码格式映射为相应的 UNICODE , 而不是看做简单的 ASCII 字符.
所以编码格式就是处理源码中的各种各样的字符, 与运行时无关, 所以如果你的
源文件中没有直接需要使用中文的地方, 比如菜单, 按钮, 标签什么的, 就不需
要指定编码了.
    二, 字体的选择: 必须使用能够显示中文的字体, 好象有些废话. 但还是有
必要说一说. AWT 可以在中文系统中直接显示中文, 但是在不是中文系统但是有
中文字体的系统中不能, 需要修改一下 $JAVA_HOME/jre/lib/font.properties,
加入中文字体, 至于怎么加入, 就不谈了. 而 Swing 不需要这样, 只要你的系统
中有中文字体就可以使用这样的字体来显示中文. 怎么知道一种字体能不能显示
中文呢? 看下面的程序片段: (注 2)

      Font[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
      System.out.println("Chinese Fonts: \n");
      for (int i = 0; i < fonts.length; i ++)
      {
            if (fonts.canDisplayUpTo("\u4e00") > 0)   // 注 3
            {
                System.out.println(fonts.getFontName());
            }
      }
   
好了, 知道了系统中有没有中文字体, 然后选择一个就是了. 如果选择了不能显示
中文的字体, 通常的情况是显示方框.
    好了, Swing 的中文显示介绍完了, 输入和编辑中文就和显示差不多, 选一个
字体就可以了, 具体得看你而 Linux 的具体设置了, 这里就不多说了.
    从以上两点来看, 其实最重要的还是字体的选择. 我的网站上有 ScreenShot
和测试程序, 欢迎来访问. http://SuperMMX.dhs.org

环境:
jdk1.2.2
debian 2.2r3

注 1: 据 jdk1.2.2 的文档, 并没有这个属性, 很奇怪, 但是确实可用.

注 2: jdk 1.2 以上自带的字体支持 Unicode, 但是不支持 Unicode 汉字. 所以
      打出来的结果包含了 jdk 自带的字体.

注 3: UNICODE 中, UNICODE 汉字从 \u3400 到 \u9FFF 中间, \uF900 到 \uFAFF
      也有一些, 但是 GB2312 和 Big5 的汉字和字符都是在 \u4E00 到 \u9FFF
      中间.
   
参考文献:

jdk tools doc
一篇没有作者名字, 也没有出处的英文文章.

页: [1]
查看完整版本: 1-1-16-1-4 Linux 下 Java 的中文问题