2012-02-07 18 views
4

"SansSerif"のような論理フォントを使用して、同じJavaアプリケーションで繁体字と簡体字の両方の文字を描画できますか?私はCJKのコードポイントで伝統的なバラエティを得るだけです。Javaで繁体字と簡体字中国語の両方を表示する

フォントを作成する前に、Locale.setDefault()およびGraphicsEnvironment.preferLocaleFonts()を設定しようとしました。私は、java.exeを起動するときにコマンドラインで-Duser.languageと-Duser.countryを使ってみました。また、AttributedCharacterIterator.Attribute.LANGUAGEを設定してフォントを作成してみました。無効。

私はSwingまたはAWTを使用していません。オフスクリーンのBufferedImageを描画しようとしています。私はWindows 7で、繁体字と簡体字中国語(MingLiUとSimSun)をサポートするフォントがインストールされていることを確認しました。私はJavaのフォント設定ファイルも調べましたが、そこにリストされているフォントの両方が表示されています。

他に何をすべきですか?

+0

ます任意のユースケース従来の&簡体字中国語のテキストを同じコンポーネントで表示する必要がありますか? – belgther

+0

私は、ユーザーがアプリケーションを再起動せずにオンザフライで言語を切り替えるようにしたいと考えています。また、リスト内の使用可能な言語の名前はネイティブスクリプトで書かれているので、それらも適切に表示します。 – ThVortex

+1

あなたの場合、私はあなたのテキストを描画するためのフォントとテキストを設定することをお勧めします。まず1つのフォントでレンダリングし、次にもう一方のフォントでレンダリングします。それは働くだろうか? – belgther

答えて

0

はい、両方の文字セットを含むフォントを使用している限り、簡体字中国語と繁体字中国語の両方のテキストをJavaで表示できます。

は私が実証するために、この簡単なプログラムを書いた:

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.util.ArrayList; 
import java.util.List; 

import javax.imageio.ImageIO; 

public class ChineseFonts { 

    public static final int GAP = 35; 
    public static final int FONTS_PER_LINE = 2; 

    public ChineseFonts(String s) { 

     Rectangle rect = new Rectangle(0, 0, 1024, 768); 
     BufferedImage bufferedImage = new BufferedImage((int) Math.ceil(rect.getWidth()), (int) Math.ceil(rect.getHeight()), BufferedImage.TYPE_4BYTE_ABGR); 
     Graphics graphics = bufferedImage.getGraphics(); 
     graphics.setColor(Color.WHITE); 
     graphics.fillRect(rect.x, rect.y, rect.width, rect.height); 
     graphics.setColor(Color.BLUE); 

     String title = "Chinese Fonts on " + System.getProperty("os.name") + ", version " + System.getProperty("os.version"); 
     int fontY = 30; 
     printString(title, graphics, 0, fontY, new Font(Font.SERIF, Font.BOLD | Font.ITALIC, 28), false); 
     fontY += GAP + 10; 
     int counter = 0; 
     for (String fontName : new String[]{Font.MONOSPACED, Font.SANS_SERIF, Font.SERIF}) { 
      Font font = new Font(fontName, Font.PLAIN, 24); 
      printString(s, graphics, counter++, fontY, font, true); 
      if (counter % FONTS_PER_LINE == 0) 
       fontY += GAP; 
     } 
     Font[] localFonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts(); 
     List<Font> chineseFonts = new ArrayList<Font>(); 
     String simplifiedAndTraditionalChinese = "????"; 
     for (int j = 0; j < localFonts.length; j++) { 
      if (localFonts[j].canDisplayUpTo(simplifiedAndTraditionalChinese) == -1) { 
       chineseFonts.add(localFonts[j].deriveFont(24F)); 
      } 
     } 
     for (Font font : chineseFonts) { 
      printString(s, graphics, counter++, fontY, font, true); 
      if (counter % FONTS_PER_LINE == 0) 
       fontY += GAP; 
     } 
     graphics.dispose(); 
     try { 
      ImageIO.write(bufferedImage, "png", new File("chineseFonts.png")); 
     } catch (Exception e) { 
      // ignored 
     } 
    } 

    private void printString(String s, Graphics graphics, int counter, int y, Font font, boolean showFontDetails) { 
     graphics.setFont(font); 
     if (showFontDetails) 
      s = font.getFamily() + " " + s; 
     graphics.drawString(s, 20 + (counter % FONTS_PER_LINE) * 510, y); 
     if (showFontDetails) 
      System.out.println("Printing " + s + " using " + font.getName() + ", which is " + font.getFontName() + " in family " + font.getFamily()); 
    } 

    public static void main(String args[]) { 
     new ChineseFonts("S: 漢字 T: 汉字"); 
    } 
} 

使用簡素化2及び2つの伝統的な中国の文字が漢字にWikipediaのページからです。実行すると、使用されているすべてのフォントがstdoutに出力され、イメージはフォント名と漢字で出力されます。ここで

3つの論理フォントと働いていた最初の物理フォントです:

  • は等幅
  • サンセリフ
  • セリフ
  • はArial UnicodeのMS S
+0

多くの場合、同じUnicodeコードポイントには、繁体字および簡体字中国語の異なるグリフがあります(http://en.wikipedia.org/wiki/Han_unification#Examples_of_language_dependent_characters)。 OpenTypeフォントに言語固有のグリフを格納する方法はありますが、フォントに "繁体字中国語グリフを使用する"ように指示する必要があります.Javaはそれを行うことはできません。 –

+0

これは尋ねられたことではありません。問題は、Javaで論理フォントを使用して簡体字と繁体字の両方を表示できるかどうかということでした。異なる言語の別名グリフを持つコードポイントの統一グリフをユーザーが受け入れることができない場合、ユーザーはJavaのfont.propertiesを構成して、優先言語のより良い物理フォントを選択できます。利用可能ないくつかの良い中国語フリーフォントがあります。 –

+0

to Colm:私のコメントはこの答えのためであり、質問のためではありません。具体的には、「あなたは両方の文字セットを含むフォントを持っています」 –

関連する問題