2009-11-18 3 views
3

중국어 텍스트를 표시 할 수있는 애플릿이 있습니다. 우리는 글꼴 (Arial)을 지정하고 있으며, Windows와 Mac OSX에서 잘 작동합니다.애플릿에 중국어 텍스트 표시

그러나 Linux의 Firefox에서는 한자가 정사각형으로 렌더링됩니다. 이 문제를 해결할 방법이 있습니까? 클라이언트에 특정 글꼴 파일이 있다고 가정 할 수는 없습니다.

답변

2

Windows 및 Mac의 Arial은 모두 유니 코드 글꼴이지만 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

3

이것은 글꼴이 중국어 문자 (아마도 추측 한 것)를 지원하지 않는다는 것을 나타냅니다.

재미있는 java.awt.Font.canDisplayUpto() 메소드가 있습니다.

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

는 "지정된 String를,이 Font로 표시 할 수 있을지 어떨지를 나타냅니다. 유니 코드 인코딩 문자열의 경우, 특정 글꼴이 문자열을 표시 할 수 있는지 아는 것이 중요합니다.이 방법은 문자열로 오프셋 (offset)를 돌려줍니다 str -이 Font가 누락 된 글리프 (glyph) 코드를 사용하지 않고는 표시 할 수없는 첫 번째 문자입니다. 글꼴이 모든 문자를 표시 할 수 있으면 -1이 반환됩니다. "

0

당신은 object 태그에 다음 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()); 
    } 
} 
관련 문제