哪个系统组件负责绑定Java应用程序中的Unicode连字?

哪个系统组件负责绑定Java应用程序中的Unicode连字?,java,unicode,character-encoding,rendering,system,Java,Unicode,Character Encoding,Rendering,System,这是一个“元问题”,我在试图为我的另一个问题找到更好的规范()时遇到了这个问题 到目前为止,我还不太清楚的是,给定系统的哪个“组件”(因为缺少更好的词)负责在Java中显示Unicode文本,更具体地说是连字 据我所知,以下组件对流程有影响: 系统字符编码(例如Mac OS X 10.6上的UTF-8,Windows 7上的UTF-16(根据akira对此的评论)) JavaCharset(在Mac OS X 10.6上默认为MacRoman,在Windows 7上默认为cp1252) 用于呈现

这是一个“元问题”,我在试图为我的另一个问题找到更好的规范()时遇到了这个问题

到目前为止,我还不太清楚的是,给定系统的哪个“组件”(因为缺少更好的词)负责在Java中显示Unicode文本,更具体地说是连字

据我所知,以下组件对流程有影响:

  • 系统字符编码(例如Mac OS X 10.6上的UTF-8,Windows 7上的UTF-16(根据akira对此的评论))
  • Java
    Charset
    (在Mac OS X 10.6上默认为MacRoman,在Windows 7上默认为cp1252)
  • 用于呈现文本的字体,以及该字体的编码信息(如Donal Fellows在: “字体包括他们使用的编码信息”

  • 显然,要呈现的字符是否存在于相应的Unicode代码点
  • 因此,如果一个Unicode字符字符串不能正确显示(如我的另一个问题s.a.所示),那么问题最有可能出现在哪里?即,哪个“组件”(更好的词是什么?)负责“绑定”连字及其组成


    非常感谢您,如果您需要更多信息,请让我知道。

    如果您严格地将引用到可视化渲染,那么“编码”和相关主题将不再相关:渲染将从
    String
    转到可视化显示。
    String
    具有已定义(且不可更改)的编码,即UTF-16。因此,所有问题,如“我是否使用正确的编码读取此二进制流”都必须首先解决

    文本的实际呈现必须由图形子系统完成。对于“普通”Java或SWT或任何其他替代系统,这将是AWT/Swing


    第一步(严格来说不是“渲染”的一部分)是将一些二进制数据转换为
    字符串
    。这可能涉及平台默认编码iff代码没有明确指定某些编码。这是编码通常发挥作用的步骤。之后,我们进入了快乐的纯Unicode领域。

    类似于Joachim所说的,da的来源是什么ta?如果您正在读取文件或流,我肯定不相信系统默认编码。您应该在读取数据时显式设置编码,例如

    BufferedReader br = new BufferedReader( new InputStreamReader( file, "UTF-8" ) );
    
    或者不管你的流是什么编码

    见:

    )我不是专家,但希望这些提示能为您指明正确的方向

    源数据的编码与字体的呈现方式关系不大。Java中的所有字符数据都是UTF-16,所以只要您正确地将信息从源代码转换为字符/字符串,数据的完整性就应该得到保护

    但是,请注意:

    • AWT系统可以使用默认的系统编码来进行字体映射
    • 这不太可能适用于Devanagari(我不知道支持它的遗留编码)
    AWT映射字体是通过。在我的Windows系统上,这映射到Mangal字体:

    allfonts.devanagari=Mangal
    
    毫无疑问,Mac OS上使用的是另一种字体

    本机文本呈现是在Java6的生命周期中引入的,我不知道这是否与字体支持有任何关系,或者仅仅影响呈现速度/抗锯齿/等等

    • Java6文档

    该系统组件称为字体渲染器或字体光栅化器。它负责根据字体中定义的字形将字符代码序列转换为像素。正如其他答案所述,您可以从Java获取和设置的各种字符编码值是不相关的。当JVM给字体渲染器一系列字符代码时,它会告诉它应用了什么编码(可能是UTF16,但这对Java程序员来说是透明的)。字体渲染器使用字体文件中指定的字体编码来匹配相应的字形

    当前版本的Windows和Mac OS X都配有出色的字体渲染器

    混淆的第一点是JRE自带了自己的字体渲染器,作为Java2D平台的一部分,这就是Swing所使用的。应该有一个选项来控制Java是使用自己的渲染器还是使用系统渲染器

    编辑:正如评论中指出的,在OS X上,您可以通过设置Java属性apple.awt.graphics.UseQuartz=true来启用系统渲染器

    混淆的第二点是连字在英语中是可选的。当桌面发布应用程序看到“shuffle”这样的词时,它将替换“ffl”连字(字体中的一个字形),但大多数其他应用程序都不介意。根据你对Devanagari所说的话(以及我刚刚在维基百科上读到的内容),我推测在该语言中,连字不是可选的


    默认情况下,Java2D字体渲染器不进行连字。但是,java.awt.font.texttribute.ligations的JavaDoc表示,对于需要连字的系统,总是启用连字。如果这不是您的经验,那么您可能在Java2D字体渲染器中发现了一个bug。同时,尝试使用字体构造器,该构造器获取字体属性的映射,包括TextAttribute.Ligations。

    我会冒险猜测虚拟机,但我在这方面没有证据或专业知识。@Mr47:好的,谢谢,那就是第(2)条了。我想这可能会派上用场。我会记住这一点。我对帖子做了一些修改,为其他人指明了我的问题的“切入点”。非常感谢你对术语的说明。恐怕我的解释不是很具体。但是,假设正确显示连字(例如。,लक्ष्मी, 它是使用七个Unicode代码点构建的,或者