查找即将出现的符号的unicode ID

查找即将出现的符号的unicode ID,unicode,utf-8,utf-16,Unicode,Utf 8,Utf 16,我试图理解Unicode在表示特定符号组合时是如何工作的。 例如,如果我将以下三个德文加里(印地语)符号组合在一起: न + ◌् () + न 我应该得到以下信息: न्न 现在,对于前三个符号,我能够在Windows中使用字符映射找到相应的符号,我得到: न --> UTF-16编码:0x0928 ◌् --> UTF-16编码:0x094D 或者,在Unicode xml表示法中的等效形式: न --> "न"; ◌् --> "्"; 现在,尽管我努力寻找这三者的组合

我试图理解Unicode在表示特定符号组合时是如何工作的。 例如,如果我将以下三个德文加里(印地语)符号组合在一起:

न + ◌् () + न

我应该得到以下信息:

न्न

现在,对于前三个符号,我能够在Windows中使用
字符映射
找到相应的符号,我得到:

न --> UTF-16编码:0x0928

◌् --> UTF-16编码:0x094D

或者,在Unicode xml表示法中的等效形式:

न --> "न";

◌् --> "्";

现在,尽管我努力寻找这三者的组合,但我没有找到 不管怎样,这个符号
न्न
必须具有Unicode表示,对吗


谢谢。

Unicode是关于字符“代码”的。不是关于字形(所以是数字)

Unicode代码点有不同的解释。通常是可打印字符或组合字符(将修改以前的字符)

此外,字体还可以合并其他字符(不仅仅是结合unicode代码点)。在拉丁文字(大写字母)上,这是非常罕见的,但在印度语中,这是一条规则。但印度语言在如何组合或合并字符方面也有不同的规则。您可以使用字体、语言修饰符(如HTML)或/和
zero width non joiner
zero width joiner
来定义它。这些标记了意图:您是希望两个字符显示为独立的(所以没有连接),还是希望它们显示为组合的(如果字体更喜欢这种组合,比如不连接)

您可能需要阅读和阅读后续章节。您将了解更多关于印度脚本如何使用unicode的内容,并了解大量异常和规则(unicode也适用于实际语言的旧版本)

注:有一个
DEVANAGARI字母NNNA
ऩ, 和
DEVANAGARI字母NNA
ण. 我不懂印度语言,但我应该像你的角色一样吗?(但它们似乎完全不同)


但正如您在我的链接文档(来自Unicode)中所看到的,在如何混合代码点方面有许多规则和例外(以及建议)。对于Unicode来说,它不是一种简单的语言,对于字体设计师来说更为复杂。

您的符号是三重组合(Python用于序数和命名):

其标志符号没有单个Unicode字符。如果可能,规范化将结合代码点:

>>> len(ud.normalize('NFC',s))
3

让我们首先准确地定义一些术语

Unicode对字符和字元(或字元簇)进行了区分。你说的是符号,但实际上你指的是人物。符号只是字符的一个属性:

U+0928 ‹न› \N{DEVANAGARI LETTER NA} Other_Letter
U+25CC ‹◌› \N{DOTTED CIRCLE} Other_Symbol
U+094D ‹◌्› \N{DEVANAGARI SIGN VIRAMA} Combining_Mark
每个字符都有一个数字id(四个或五个十六进制数字),称为代码点



前面的所有内容都是低级细节,不需要关注最终用户或处理文本的程序员,它应该只与少数实现Unicode编程语言的程序员相关。(不幸的是,大多数软件——包括编程语言——都是残破的、设计不好或实现不好的,因此抽象泄露了。),न्न 由两个图形组成:

› perl -Mutf8 -E 'say scalar split /\b{g}/, "न्न"'
2
› perl6 -e '"न्न".chars.say'
2
› node -e 'console.log((new(require("grapheme-splitter"))).countGraphemes("न्न"))'
2
(显示3的Python答案不正确。)

在标记文本或删除从右侧开始的文本时,您仍然可以看到它是两个图形⌫ 退格键:



न्न 渲染为单个图示符,因为它是连字。很多剧本都像那样怪异,不仅仅是德瓦纳加里。因此,在Unicode中查找标志符号的id是没有意义的,因为字体文件中只有一个id。例如,在字体系列“Noto Sans Devanagari UI”中,字形可以通过其id
nanadeva

找到。这是UnicodeI的一个很好的入门教程。我不确定上一个建议:Unicode(按设计)更喜欢分解。维马拉不是严格意义上的重音或修饰语。它只是去除了隐含的声音。顺便说一句,印度语言合并了各种字母(就像我们在拉丁草书中所做的那样:在拉丁语中,我们从来不希望字符串上有这样的组合(只是在显示中),合并并不总是阅读文本的好方法。顺便说一句,我认为产生的字形取决于语言。[顺便说一句,我没有找到它,但通常Unicode在
NFC
(而且只能在非常有限的语言情况下使用)。@Giacomo Catenazzi,virama是一个非空格标记/组合标记,与重音符号相同。请检查属性。@daxim:是的,用于Unicode编码,但语义非常不同。因此,我们有ZWJ和ZWNJ(可能是Unicode标准中使用最多的单词),在印刷拉丁语中,您可能只会在非常特定的用法中使用ZWNJ。这也是Unicode中应避免使用许多组合的原因(例如,请参阅Devanagari章节)。在拉丁语中,您可以删除重音,文本仍然可读。Vimara对以下字符也有影响。它描述人声(或缺少人声)在两个辅音之间。我添加了关于可能合并字符的最后两段(但它们看起来不同)。Python
len
计算代码点,这通常是程序员最重要的部分(例如迭代到一个字符串)。只有一个人应该知道
len
/size/.等所描述的内容。这并不是一个bug或糟糕的实现。在印度语言中,相同的代码点可以用不同数量的字元打印(旧的书写往往使用较少的字元,但不同的地区使用不同的约定)。只有从字体渲染中获取数据才能给出正确的字符长度。顺便说一句,还有一个Unicode附件(光标位置)。你刚才写的句子1、2、3、5都错得很厉害。不能通过代码点进行迭代或度量,期望它做一些正常或有用的事情;在Python中,必须使用适当的库。长度
› perl -Mutf8 -E 'say scalar split /\b{g}/, "न्न"'
2
› perl6 -e '"न्न".chars.say'
2
› node -e 'console.log((new(require("grapheme-splitter"))).countGraphemes("न्न"))'
2