2009-11-18 30 views
3

我們有一個可以顯示中文文本的Applet。我們正在爲它指定一種字體(Arial),它在Windows和Mac OSX下都能正常工作。在Applet中顯示中文文本

但是在Linux上的Firefox中,中文字符呈現爲正方形。有沒有辦法解決這個問題?請注意,我們不能假定客戶端上存在特定的字體文件。

回答

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); 

} 
+0

查看我對不同使用場景和更有用代碼的回答 – gregm 2010-06-29 16:19:58

3

這表明字體不支持中文字符(您可能猜到了)。

您可能會發現java.awt.Font.canDisplayUpto()方法很有趣。

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

「指示此字體是否可以顯示指定的字符串。對於具有Unicode編碼字符串,它知道一個特定字體可以顯示該字符串是重要的。該方法返回的偏移到字符串str這是Font不能使用缺少的字形代碼時顯示的第一個字符,如果Font可以顯示所有字符,則返回-1。

0

您可能必須通過以下PARAM中的對象標籤: <param name="java_arguments" value="-Dfile.encoding=utf-8" />

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()); 
    } 
}