JavaからWindowsコマンドプロンプトに「国際的な」文字を出力する際の問題は3つあります。
- デフォルトのラスターフォントはそれをサポートしていません
- デフォルトの8ビットコードページはDOS時代にさかのぼり、システムのデフォルトのWindowsエンコーディングと同じではありません
- Java(System.out)は、デフォルトのオペレーティングシステムエンコーディングで出力をエンコードします。これは、Windowsでは本質的に損失の多いプロセスになります。
Javaに文字を出力させるには、次のいずれかを実行します。
- MUIをインストールし、必要な文字を許可する設定に切り替えます(エンコードを切り替えるには、 chcpを使用する必要がある場合があります)
- コンソールを文字を含むUnicodeTrueTypeフォントに切り替え、ネイティブメソッド(WriteConsoleW)を使用してテキストを出力します。
それをすべて説明するリンク:
Swingの下にキャラクターを表示する方が幸運かもしれません。このようなアプリを使用して、Swingで使用可能なフォントをテストし、それらが文字をレンダリングするかどうかを確認できます。
public class FontTest {
// a Cyrillic and two CJK characters
private final String filename = "\u044F\u4E10\u4E20.txt";
private ComboBoxModel createModel() {
GraphicsEnvironment genv = GraphicsEnvironment
.getLocalGraphicsEnvironment();
Vector<Font> fonts = new Vector<Font>();
for (Font font : genv.getAllFonts()) {
Font newFont = new Font(font.getFontName(), font
.getStyle(), 12);
fonts.add(newFont);
}
DefaultComboBoxModel model = new DefaultComboBoxModel(
fonts);
return model;
}
private JFrame createGui() {
final JLabel label = new JLabel();
label.setText(filename);
final JComboBox combo = new JComboBox();
combo.setEditable(false);
combo.setModel(createModel());
combo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Font font = (Font) combo.getSelectedItem();
label.setFont(font);
}
});
label.setFont((Font) combo.getItemAt(0));
JFrame frame = new JFrame();
Container contentPane = frame.getContentPane();
contentPane.setLayout(new GridLayout(0, 1));
contentPane.add(label);
contentPane.add(combo);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
return frame;
}
public static void main(String[] args) {
JFrame frame = new FontTest().createGui();
frame.setVisible(true);
}
}
XPでのJava6は、デフォルトのJLabelフォントを使用してすべての文字を完全に表示します(ダイアログ-他のものへの論理名マッピングであるため、charmapでは表示されません)。