Я пытаюсь отобразить глиф, соответствующий юникоду 0x95E8. Этот код в основном представляет собой блок CJK (китайский, японский, корейский).
Я изо всех сил пытаюсь понять, может ли представление глифов этой конкретной кодовой точки отличаться для японского и китайского языков.
Когда я показываю этот U + 95E8 в JTextArea, я могу видеть символ «门» в linux / windows. Но когда я пытаюсь отобразить тот же код на моем «встроенном устройстве». отображаемый символ изменится на.
Я хочу знать, должна ли эта кодовая точка 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();
}
}
});
}
}
2 ответа
Как правило, символы CJK в Unicode «унифицированы», что означает, что используется одна кодовая точка, даже если символы традиционно несколько различались для разных языков. Теоретически один шрифт может содержать несколько глифов для кодовой точки с некоторым механизмом выбора. На практике шрифт, содержащий символы CJK, обычно имеет для них единый дизайн, отражающий дизайн традиционного китайского, упрощенного китайского, японского или корейского языков. В этом смысле некоторые шрифты можно назвать «традиционными китайскими», «японскими» и т. Д.
Очевидно, вы должны выбрать шрифт в соответствии с языком текста.
Глиф на изображении в вопросе выглядит несколько странно и отличается от глифы для U + 95E8 в некоторых распространенных шрифтах, которые обычно имеют довольно похожий дизайн для этого персонажа. Таким образом, для этого конкретного символа можно ожидать изменения только в общем стиле (например, с засечками или без засечек, шириной штриха). Кажется, что используемый шрифт как-то странно оформлен, по крайней мере, для этого персонажа,
Добавление к ответу Юкки:
Вот дополнительная информация об «объединении ханьцев»: http://en.wikipedia.org/wiki/ Han_unification
Существует два основных способа визуализации желаемого глифа:
- Используйте шрифт, зависящий от локали (означает разные шрифты для традиционного китайского, упрощенного китайского, японского и корейского языков). Создатели таких шрифтов стараются поступать правильно. Это ответ Юкки. В качестве примера вы можете взглянуть на семейство шрифтов Noto ( http://www.google.com/get/noto/cjk.html). Загрузите файлы «Шрифты для конкретных языков в OTF»:
- Шрифт для упрощенного китайского – NotoSansHans-Regular.otf.
- Шрифт для традиционного китайского – NotoSansHant-Regular.otf.
- Японский шрифт — NotoSansJP-Regular.otf.
- Корейский шрифт — NotoSansKR-Regular.otf.
- Используйте общий шрифт CJK с несколькими глифами, специфичными для локали. В качестве примера вы снова можете использовать шрифт CJK Noto, параметр «Многоязычные шрифты в OTF». См. «Таблица сценариев и системная запись языка» на странице http://www.microsoft.com/ typography / otspec / chapter2.htm. Но чтобы использовать этот шрифт, он должен содержать информацию, механизм рендеринга текста должен понимать, как обращаться с языковыми настройками, а API должен предоставлять их.
Теперь то, что ниже, находится на очень низком уровне. Когда вы используете что-то вроде JTextArea, у вас нет контроля. Вы используете то, что решили сделать разработчики JTextArea.
Вы можете вызвать setDefaultLocale вашего компонента, и это может помочь. Это рекомендуется делать, несмотря ни на что. Но если вы хотите быть уверенным в том, что происходит, вы берете на себя управление и указываете шрифт для конкретного языка.
как я могу распознать правильный шрифт / среду на моем ПК, из-за которой печатается "门".
Вы не можете этого сделать надежно. Слои ниже Java могут выполнять свои собственные резервные операции. И вы не можете легально распространять шрифты Windows.
Чтобы я мог установить тот же шрифт на свое встроенное устройство
Не надо. Используйте шрифт хорошего качества с открытым исходным кодом. Шрифты Noto - очень хороший вариант.
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.