Отображение как традиционного, так и упрощенного китайского на Java - PullRequest
4 голосов
/ 07 февраля 2012

Можно ли рисовать как традиционные, так и упрощенные китайские символы в одном приложении Java с помощью таких логических шрифтов, как "SansSerif"? Я получаю только традиционный сорт с кодовыми точками CJK.

Я пытался установить Locale.setDefault () и GraphicsEnvironment.preferLocaleFonts () перед созданием шрифта. Я пытался использовать -Duser.language и -Duser.country в командной строке при запуске java.exe. Также попытался создать шрифт с установленным на нем AttributedCharacterIterator.Attribute.LANGUAGE. Нет эффекта.

Я не использую Swing или AWT. Просто пытаюсь нарисовать закадровый BufferedImage. Я на Windows 7, и я подтвердил, что у меня установлены шрифты, которые поддерживают традиционный и упрощенный китайский (MingLiU и SimSun). Я также проверил файл конфигурации шрифтов Java и вижу там оба этих шрифта.

Что еще мне делать?

1 Ответ

0 голосов
/ 23 февраля 2012

Да, вы можете отображать как упрощенный, так и традиционный китайский текст на 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 традиционных китайских иероглифа со страницы Википедии о китайских иероглифах. При запуске все используемые шрифты печатаются в стандартный вывод, а изображение выводится с именами шрифтов и китайскими символами.

Вот три логических шрифта и первый работающий физический шрифт:

  • Моноширинный
  • SansSerif
  • С засечками
  • Arial Unicode MS S
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...