Affichage du Chinois Traditionnel et Simplifié en Java


Est-il possible de dessiner des caractères chinois traditionnels et simplifiés dans la même application Java avec des polices logiques comme "SansSerif"? Je n'obtiens la variété traditionnelle qu'avec des points de code CJK.

J'ai essayé de définir les paramètres régionaux.setDefault () et GraphicsEnvironment.preferLocaleFonts () avant de créer la police. J'ai essayé d'utiliser-Duser.de la langue et de -Duser.pays sur la ligne de commande lors du démarrage de java.EXE. Aussi essayé de créer la police avec AttributedCharacterIterator.Attribut.LANGUE définie sur elle. Pas d'effet.

Je n'utilise pas Swing ou AWT. Juste essayer de dessiner dans un BufferedImage hors écran. Je suis sur Windows 7 et j'ai vérifié que j'ai installé des polices qui prennent en charge le chinois traditionnel et simplifié (MingLiU et SimSun). J'ai également vérifié le fichier de configuration des polices de Java, et je vois ces deux polices répertoriées ici.

Que dois-je faire d'autre?

Author: ThVortex, 2012-02-07

1 answers

Oui, vous pouvez afficher du texte chinois simplifié et traditionnel en Java, à condition d'avoir une police qui inclut les deux ensembles de caractères.

J'ai écrit ce bref programme pour démontrer:

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: 汉字");
    }
}

Les 2 caractères chinois simplifiés et les 2 caractères chinois traditionnels utilisés proviennent de la page wikipédia sur les caractères chinois. Lorsque vous l'exécutez, toutes les polices utilisées sont imprimées sur stdout, et l'image est sortie avec les noms de police et les caractères chinois.

Voici les 3 logiques polices et la première police physique qui a fonctionné:

  • Monospace
  • SansSerif
  • Empattement
  • Arial Unicode MS S
 0
Author: Colm Smyth, 2012-02-22 22:27:31