德语变音符号二进制表示
German umlaut binary representations
我遇到一个奇怪的问题,我尝试比较的两个 Unicode 变量看起来相同,但它们的二进制表示形式不同。当我查看上传的文件时,它显示文件名的二进制表示形式略有不同。这仅发生在从 Safari 浏览器上传时。我不是 Unicode 方面的专家我对两个具有不同二进制 Unicode 表示但相同的字符串感到困惑。
有没有人知道这是为什么?表示德语变音符号的额外字节实际上是什么意思?
apple-macintosh:~ vijay$ hexdump /tmp/a
0000000 55 6e 74 65 72 73 74 c3 bc 74 7a 74 65 5f 50 72
0000010 6f 6a 65 6b 74 65 2e 64 6f 63 78
000001b
apple-macintosh:~ vijay$ more /tmp/a
Unterstützte_Projekte.docx
apple-macintosh:~ vijay$ hexdump /tmp/b
0000000 55 6e 74 65 72 73 74 75 cc 88 74 7a 74 65 5f 50
0000010 72 6f 6a 65 6b 74 65 2e 64 6f 63 78
000001c
apple-macintosh:~ vijay$ more /tmp/b
Unterstützte_Projekte.docx
apple-macintosh:~ vijay$
字节序列 0xc3bc(元音变音)表示为 75cc88。我不确定这些是否是变音符号的独特代表。任何见解都会对我了解如何以可靠的方式比较这些文件名非常有帮助
C3 BC
是单个 Unicode 代码点 ü
.
的 UTF-8 编码形式
75 CC 88
是两个 Unicode 代码点 u
和 ̈
.
的 UTF-8 编码形式
第二种是带有ASCIIu
和组合标记的分解形式
一些编程语言有库来处理这个问题,例如 Python:
>>> import unicodedata as ud
>>> s = 'Unterstützte_Projekte.docx'
>>> s1 = ud.normalize('NFC',s) # Combined form
>>> s2 = ud.normalize('NFD',s) # Decomposed form
>>> s1 == s2 # They don't compare equal
False
>>> print(s1) # But look the same...
Unterstützte_Projekte.docx
>>> print(s2)
Unterstützte_Projekte.docx
将两个值转换为相同的值以进行比较
>>> ud.normalize('NFC',s1) == ud.normalize('NFC',s2)
True
>>> ud.normalize('NFD',s1) == ud.normalize('NFD',s2)
True
我遇到一个奇怪的问题,我尝试比较的两个 Unicode 变量看起来相同,但它们的二进制表示形式不同。当我查看上传的文件时,它显示文件名的二进制表示形式略有不同。这仅发生在从 Safari 浏览器上传时。我不是 Unicode 方面的专家我对两个具有不同二进制 Unicode 表示但相同的字符串感到困惑。
有没有人知道这是为什么?表示德语变音符号的额外字节实际上是什么意思?
apple-macintosh:~ vijay$ hexdump /tmp/a
0000000 55 6e 74 65 72 73 74 c3 bc 74 7a 74 65 5f 50 72
0000010 6f 6a 65 6b 74 65 2e 64 6f 63 78
000001b
apple-macintosh:~ vijay$ more /tmp/a
Unterstützte_Projekte.docx
apple-macintosh:~ vijay$ hexdump /tmp/b
0000000 55 6e 74 65 72 73 74 75 cc 88 74 7a 74 65 5f 50
0000010 72 6f 6a 65 6b 74 65 2e 64 6f 63 78
000001c
apple-macintosh:~ vijay$ more /tmp/b
Unterstützte_Projekte.docx
apple-macintosh:~ vijay$
字节序列 0xc3bc(元音变音)表示为 75cc88。我不确定这些是否是变音符号的独特代表。任何见解都会对我了解如何以可靠的方式比较这些文件名非常有帮助
C3 BC
是单个 Unicode 代码点 ü
.
75 CC 88
是两个 Unicode 代码点 u
和 ̈
.
第二种是带有ASCIIu
和组合标记的分解形式
一些编程语言有库来处理这个问题,例如 Python:
>>> import unicodedata as ud
>>> s = 'Unterstützte_Projekte.docx'
>>> s1 = ud.normalize('NFC',s) # Combined form
>>> s2 = ud.normalize('NFD',s) # Decomposed form
>>> s1 == s2 # They don't compare equal
False
>>> print(s1) # But look the same...
Unterstützte_Projekte.docx
>>> print(s2)
Unterstützte_Projekte.docx
将两个值转换为相同的值以进行比较
>>> ud.normalize('NFC',s1) == ud.normalize('NFC',s2)
True
>>> ud.normalize('NFD',s1) == ud.normalize('NFD',s2)
True