我有一个奇怪的问题,我尝试比较的两个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。我不确定这些是否是变音符号的独特代表。任何见解对我来说如何以可靠的方式比较这些文件名都会很有帮助
答案 0 :(得分:1)
C3 BC
是单个Unicode代码点ü
的UTF-8编码形式。
75 CC 88
是两个Unicode代码点u
和̈
的UTF-8编码形式。
第二个是带有ASCII u
和组合标记的分解形式。
某些编程语言具有处理此问题的库,例如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.org's Unicode Normalization Forms。