Различное представление кодовых точек Юникода на японском и китайском языках.

Я пытаюсь отобразить глиф, соответствующий unicode 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();
                }
            }
        });
    }
}

person Yogesh    schedule 22.07.2014    source источник


Ответы (2)


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

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

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

person Jukka K. Korpela    schedule 22.07.2014
comment
добавив также тестовый код, не могли бы вы сообщить мне, как я могу распознать правильный шрифт / среду на моем ПК, которая вызывает печать 门. Чтобы я мог установить тот же шрифт на свое встроенное устройство. - person Yogesh; 23.07.2014

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

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

Есть два основных способа отобразить желаемый глиф:

  1. Use a locale-specific font (means different fonts for Chinese Traditional, Chinese Simplified, Japanese, Korean). The designers of such fonts take care to do the right thing. This is Jukka's answer. As an example you can take a look at the Noto family of fonts (http://www.google.com/get/noto/cjk.html). Download the "Language specific fonts in OTF" files:
    • The Simplified Chinese font is 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 — очень хороший вариант.

person Mihai Nita    schedule 24.07.2014