在Applet中显示中文文本

时间:2009-11-18 09:21:01

标签: java linux localization applet cjk

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

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

4 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:2)

那是因为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 );

}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

顺便说一下,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());
    }
}