Я пытаюсь отобразить глиф, соответствующий юникоду 0x95E8. Этот код в основном представляет собой блок CJK (китайский, японский, корейский).

Я изо всех сил пытаюсь понять, может ли представление глифов этой конкретной кодовой точки отличаться для японского и китайского языков.

Когда я показываю этот U + 95E8 в JTextArea, я могу видеть символ «门» в linux / windows. Но когда я пытаюсь отобразить тот же код на моем «встроенном устройстве». отображаемый символ изменится на.

japanese_glyph

Я хочу знать, должна ли эта кодовая точка U + 95E8 иметь единообразное представление во всех локали CJK (китайский, японский, корейский) или отличается для некоторых из них. Может ли такое проявление быть из-за того, что на разных устройствах установлены разные шрифты? Прошу прощения за свое невежество, но я не слишком увлекаюсь интернационализацией.

import java.awt.*;
import java.awt.event.*;
import java.util.Locale;

import javax.swing.*;

public class TextDemo extends JPanel implements ActionListener {

    public TextDemo() {
    }

    public void actionPerformed(ActionEvent evt) {
    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event dispatch thread.
     * @throws InterruptedException 
     */
    private static void createAndShowGUI() throws InterruptedException {

        JFrame frame = new JFrame(java.util.Locale.getDefault().getDisplayName());

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container contentPane = frame.getContentPane();
        contentPane.setLayout(new SpringLayout());

        Dimension size = new Dimension(500, 500);
        frame.setSize(size);
        JTextArea textArea = new JTextArea();

        //Font font1 = new Font("SansSerif", Font.BOLD, 20);
        //textArea.setFont(font1);

        textArea.setEditable(true);
        textArea.setSize(new Dimension(400,400));
        textArea.setDefaultLocale(java.util.Locale.SIMPLIFIED_CHINESE);

        textArea.setText("Printing U+95E8 : \u95e8");                
        contentPane.add(textArea);        
        frame.setVisible(true);
    }

    public static void main (String[] args) {
        java.util.Locale.setDefault(java.util.Locale.JAPANESE);
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                try {
                    createAndShowGUI();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }
}
5
Yogesh 22 Июл 2014 в 22:30

2 ответа

Лучший ответ

Как правило, символы CJK в Unicode «унифицированы», что означает, что используется одна кодовая точка, даже если символы традиционно несколько различались для разных языков. Теоретически один шрифт может содержать несколько глифов для кодовой точки с некоторым механизмом выбора. На практике шрифт, содержащий символы CJK, обычно имеет для них единый дизайн, отражающий дизайн традиционного китайского, упрощенного китайского, японского или корейского языков. В этом смысле некоторые шрифты можно назвать «традиционными китайскими», «японскими» и т. Д.

Очевидно, вы должны выбрать шрифт в соответствии с языком текста.

Глиф на изображении в вопросе выглядит несколько странно и отличается от глифы для U + 95E8 в некоторых распространенных шрифтах, которые обычно имеют довольно похожий дизайн для этого персонажа. Таким образом, для этого конкретного символа можно ожидать изменения только в общем стиле (например, с засечками или без засечек, шириной штриха). Кажется, что используемый шрифт как-то странно оформлен, по крайней мере, для этого персонажа,

4
Jukka K. Korpela 23 Июл 2014 в 00:33
Добавив также тестовый код, не могли бы вы сообщить мне, как я могу распознать правильный шрифт / среду на моем ПК, которая вызывает печать «门». Чтобы я мог установить тот же шрифт на свое встроенное устройство.
 – 
Yogesh
23 Июл 2014 в 10:40

Добавление к ответу Юкки:

Вот дополнительная информация об «объединении ханьцев»: http://en.wikipedia.org/wiki/ Han_unification

Существует два основных способа визуализации желаемого глифа:

  1. Используйте шрифт, зависящий от локали (означает разные шрифты для традиционного китайского, упрощенного китайского, японского и корейского языков). Создатели таких шрифтов стараются поступать правильно. Это ответ Юкки. В качестве примера вы можете взглянуть на семейство шрифтов Noto ( http://www.google.com/get/noto/cjk.html). Загрузите файлы «Шрифты для конкретных языков в OTF»:
    • Шрифт для упрощенного китайского – NotoSansHans-Regular.otf.
    • Шрифт для традиционного китайского – NotoSansHant-Regular.otf.
    • Японский шрифт — NotoSansJP-Regular.otf.
    • Корейский шрифт — NotoSansKR-Regular.otf.
  2. Используйте общий шрифт CJK с несколькими глифами, специфичными для локали. В качестве примера вы снова можете использовать шрифт CJK Noto, параметр «Многоязычные шрифты в OTF». См. «Таблица сценариев и системная запись языка» на странице http://www.microsoft.com/ typography / otspec / chapter2.htm. Но чтобы использовать этот шрифт, он должен содержать информацию, механизм рендеринга текста должен понимать, как обращаться с языковыми настройками, а API должен предоставлять их.

Теперь то, что ниже, находится на очень низком уровне. Когда вы используете что-то вроде JTextArea, у вас нет контроля. Вы используете то, что решили сделать разработчики JTextArea.

Вы можете вызвать setDefaultLocale вашего компонента, и это может помочь. Это рекомендуется делать, несмотря ни на что. Но если вы хотите быть уверенным в том, что происходит, вы берете на себя управление и указываете шрифт для конкретного языка.

как я могу распознать правильный шрифт / среду на моем ПК, из-за которой печатается "门".

Вы не можете этого сделать надежно. Слои ниже Java могут выполнять свои собственные резервные операции. И вы не можете легально распространять шрифты Windows.

Чтобы я мог установить тот же шрифт на свое встроенное устройство

Не надо. Используйте шрифт хорошего качества с открытым исходным кодом. Шрифты Noto - очень хороший вариант.

4
Mihai Nita 2 Фев 2017 в 09:11