중국어 텍스트를 표시 할 수있는 애플릿이 있습니다. 우리는 글꼴 (Arial)을 지정하고 있으며, Windows와 Mac OSX에서 잘 작동합니다.애플릿에 중국어 텍스트 표시
그러나 Linux의 Firefox에서는 한자가 정사각형으로 렌더링됩니다. 이 문제를 해결할 방법이 있습니까? 클라이언트에 특정 글꼴 파일이 있다고 가정 할 수는 없습니다.
중국어 텍스트를 표시 할 수있는 애플릿이 있습니다. 우리는 글꼴 (Arial)을 지정하고 있으며, Windows와 Mac OSX에서 잘 작동합니다.애플릿에 중국어 텍스트 표시
그러나 Linux의 Firefox에서는 한자가 정사각형으로 렌더링됩니다. 이 문제를 해결할 방법이 있습니까? 클라이언트에 특정 글꼴 파일이 있다고 가정 할 수는 없습니다.
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);
}
이것은 글꼴이 중국어 문자 (아마도 추측 한 것)를 지원하지 않는다는 것을 나타냅니다.
재미있는 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이 반환됩니다. "
당신은 object 태그에 다음 PARAM을 통과해야 할 수도 있습니다 : <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());
}
}
다른 사용 시나리오와 더 유용한 코드에 대한 내 대답보기 – gregm