ö 和 ö 有什么区别?

What is the difference between ö and ö?

以下角色很像。但它们不一样。我无法直观地看到它们的区别。谁能告诉我他们的区别是什么?为什么有两个如此相似的Unicode字符?

$ xxd <<< ö
00000000: c3b6 0a                                  ...
$ xxd <<< ö
00000000: 6fcc 880a                                o...

第一个是单个 Unicode 代码点,第二个是两个 Unicode 代码点。它们是相同字形的两种形式(Python中的示例):

import unicodedata as ud

o1 = 'ö'  # '\xf6'
o2 = 'ö'  # 'o\u0308'

for c in o1:
    print(f'U+{ord(c):04X} {ud.name(c)}')
print()
for c in o2:
    print(f'U+{ord(c):04X} {ud.name(c)}')
U+00F6 LATIN SMALL LETTER O WITH DIAERESIS

U+006F LATIN SMALL LETTER O
U+0308 COMBINING DIAERESIS

确保两个字符串处于相同的规范化形式(组合或分解)以进行比较:

print(ud.normalize('NFC',o1) == ud.normalize('NFC',o2))
print(ud.normalize('NFD',o1) == ud.normalize('NFD',o2))
True
True