在Applet中显示中文文本

我们有一个Applet可以显示中文文本。 我们正在为它指定一个字体(Arial),它在Windows和Mac OSX下工作正常。

但在Linux上的Firefox中,中文字符呈现为正方形。 有没有办法解决这个问题? 请注意,我们不能假定客户端上存在特定的字体文件。

这是因为Windows和Mac上的Arial都是Unicode字体,但在Linux上只有Latin-1字符集。 在许多Linux发行版上,中文字体是可选的,可能没有中文字体。

一个常用的技术是搜索你的字体,看看它们中的哪一个都能显示中文字符。 例如,

static final Font defaultFont =new Font( "Arial Unicode MS", Font.BOLD, 48 ); static private Font[] allFonts; static final char sampleChineseCharacter = '\u4F60'; // ni3 as in ni3 hao3 public static void loadFonts() { GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); allFonts = env.getAllFonts(); int nFonts = allFonts != null ? allFonts.length : 0; fontNames = new String[nFonts]; fontMap = new Hashtable(); String currentFamily = ""; int j = 0; for ( int i = 0; i < nFonts; i++ ) { Font font = allFonts[ i ]; System.out.println( allFonts[ i ] ); if ( font.canDisplay( sampleChineseCharacter )) { currentFamily = font.getFamily(); Object key = fontMap.put( currentFamily, font ); if ( key == null ) { // The currentFamily hasn't been seen yet. fontNames[ j ] = currentFamily; j++; } } } String tmp[] = fontNames; fontNames = new String[j]; System.arraycopy( tmp, 0, fontNames, 0, j ); } 

这表明字体不支持中文字符(你可能猜到了)。

你可能会发现java.awt.Font.canDisplayUpto()方法很有趣。

http://www.j2ee.me/javase/6/docs/api/java/awt/Font.html#canDisplayUpTo(java.lang.String&#xFF09;

“表示该Font是否可以显示指定的字符串,对于使用Unicode编码的字符串,知道某个字体是否可以显示该字符串很重要,该方法返回字符串str的偏移量,该字符串是该Font不能显示的第一个字符显示不使用缺少的字形代码,如果字体可以显示所有字符,则返回-1。

您可能必须在对象标记中传递以下参数: <param name="java_arguments" value="-Dfile.encoding=utf-8" />

我发现这里的代码不足以满足我的需求。

我需要测试一个未知的输入字符串,以确定使用什么字体,因此,我需要检查每一个字符。 (见下文)

顺便说一下,font.canDisplayUpTo方法将不起作用。 它可以批准一个字体,只能显示一些字符。

所以,只需使用下面的代码。

 Font[] allFonts; GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); allFonts = env.getAllFonts(); Font targetFont = null; for ( int i = 0; i < allFonts.length; i++ ) { Font font = allFonts[ i ]; boolean canDisplayAll = true; for (char c : text.toCharArray()) { if (!font.canDisplay(c)) { canDisplayAll = false; break; } } if (canDisplayAll) { logger.debug("font can display the text " + font.getName()); targetFont = font; break; } else { logger.debug("cant display " + font.getName()); } }