日文和中文中 unicode 代码点的不同表示

Yog*_*esh 5 java unicode locale localization chinese-locale

我正在尝试显示与 unicode 0x95E8 对应的字形。这个代码点基本上是 CJK 块(中文、日文、韩文)。

我正在努力知道这个特定代码点的字形表示对于日语和中文是否可能不同。

当我在 JTextArea 中显示这个 U+95E8 时,我能够看到“?” 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();
                }
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

Mih*_*ita 5

添加到 Jukka 的答案:

\n\n

以下是有关“汉统一”的更多信息:http ://en.wikipedia.org/wiki/Han_unification

\n\n

有两种主要方法可以呈现所需的字形:

\n\n
    \n
  1. 使用特定于区域设置的字体(意味着繁体中文、简体中文、日语、韩语的不同字体)。此类字体的设计者会注意做正确的事情。这是 Jukka 的答案。\n作为示例,您可以查看 Noto 系列字体 ( http://www.google.com/get/noto/cjk.html)。\n下载“语言特定字体”在 OTF”文件中:\n\n
      \n
    • 简体中文字体是NotoSansHans-Regular.otf
    • \n
    • 繁体中文字体为NotoSansHant-Regular.otf
    • \n
    • 日语字体是 NotoSansJP-Regular.otf
    • \n
    • 韩文字体是 NotoSansKR-Regular.otf
    • \n
  2. \n
  3. 使用具有多个特定于区域设置的字形的通用 CJK 字体。\n作为示例,您可以再次使用 CJK Noto 字体,即“OTF 中的多语言字体”选项。\n请参阅http://www.microsoft.com/typography/otspec/chapter2.htm中的“脚本表和语言系统记录” .\n但是要使用字体应该包含的信息,文本渲染引擎应该了解如何处理语言设置,并且 API 应该公开它。
  4. \n
\n\n

现在,下面的内容非常低级。\n当您使用 JTextArea 之类的东西时,您无法控制。您可以使用 JTextArea 的实现者决定执行的操作。

\n\n

您可以调用组件的 setDefaultLocale ,这可能会有所帮助。无论如何,建议您这样做。\n但如果您想确定发生了什么,您可以控制并指定特定于语言的字体。

\n\n
\n

我如何识别电脑中导致打印“\xe9\x97\xa8”的正确字体/环境。

\n
\n\n

你不能可靠地做到这一点。Java 下面的层可能会执行自己的后备操作。\n并且您无法合法分发 Windows 字体。

\n\n
\n

这样我就可以在我的嵌入式设备中安装相同的字体

\n
\n\n

不。使用开源、优质的字体。Noto 字体是一个非常好的选择。

\n


Juk*_*ela 4

一般来说,Unicode 中的 CJK 字符为 \xe2\x80\x9cunified\xe2\x80\x9d,这意味着即使不同语言的字符传统上有所不同,也使用单个代码点。理论上,单个字体可以包含一个代码点的多个字形,并具有某种选择机制。实际上,包含 CJK 字符的字体通常具有单一设计,反映繁体中文、简体中文、日语或韩语的设计。从这个意义上讲,某些字体可能被称为\xe2\x80\x9c繁体中文\xe2\x80\x9d、\xe2\x80\x9c日文\​​xe2\x80\x9d等。

\n\n

显然,您应该根据文本的语言来选择字体。

\n\n

问题中图像中的字形看起来有些奇怪,它与一些常见字体中的 U+95E8 字形不同,这些字体通常显示出与该字符相当相似的设计。因此,对于这个特定字符,变化预计仅在一般样式中(例如,衬线与无衬线、笔划宽度)。似乎所使用的字体设计有些奇怪,至少对于这个角色来说,

\n