如何查找复合 unicode 字符的 UTF-8 引用

How to find UTF-8 reference of a composite unicode character

在工作中,我遇到了这个问题,我需要找到 复合 unicode 字符UTF-8 引用

有问题的字符是一个 "n",上面有一个“^”:n̂。这在 unicode 中由字符 "n" (U+006E) 后跟抑扬音符号 (U+0302) 表示。

我要查找的是 UTF-8 中此字符的单一引用

我一直在四处寻找,但我似乎找不到这个问题的答案。我觉得自己很傻,因为找到这么简单的东西似乎并不难。

Edit :所以我认为 "n" 和 "^" 的组合可以映射到单个 UTF-8 代码点(我希望我是使用正确的术语)。但是,您向我解释说情况并非如此。 谢谢大家的帮助。

Loïc.

如果您希望字符串尽可能地组合,那么您希望它在 NFC 中(标准化形式组合,参见 Unicode equivalence). You can do this in Python using this example:

#!/usr/bin/python3

import unicodedata

for s in ['Jalapen\u0303o', 'n̂']:
  print(s)
  print(ascii(s))
  print('NFC:', ascii(unicodedata.normalize('NFC', s))) 
  print('NFD:', ascii(unicodedata.normalize('NFD', s)))
  print('')

这会给你:

Jalapeño

'Jalapen\u0303o'

NFC: 'Jalape\xf1o'

NFD: 'Jalapen\u0303o'

'n\u0302'

NFC: 'n\u0302'

NFD: 'n\u0302'

如您所见,'ñ' 既有组合形式也有分解形式,而 'n̂' 则没有。它的唯一形式被分解为两个单独的字符。

UTF-8 是一种 字节编码,用于一系列单独的 Unicode 代码点。没有为 定义单个 Unicode 代码点,即使在 NFC 或 NFKC 格式中规范化 Unicode 字符串时也是如此。正如您所注意到的, 由代码点 U+006E LATIN SMALL LETTER N 和后面的代码点 U+0302 COMBINING CIRCUMFLEX ACCENT 组成。在UTF-8中,U+006E编码为字节0x6EU+0302编码为字节0xCC 0x82.