ö 和 ö 有什么区别?
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
以下角色很像。但它们不一样。我无法直观地看到它们的区别。谁能告诉我他们的区别是什么?为什么有两个如此相似的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