Unicode 德国umlaut二进制表示法

Unicode 德国umlaut二进制表示法,unicode,filenames,Unicode,Filenames,我有一个奇怪的问题,我试图比较的两个Unicode变量看起来相同,但它们在二进制表示中不同。当我查看上传的文件时,它显示的文件名的二进制表示形式略有不同。这仅在从Safari浏览器上载时发生。我不是Unicode方面的专家,我对两个具有不同二进制Unicode表示但相同的字符串感到困惑 有没有人知道这是为什么?表示德语umlaut的额外字节实际上是什么意思 apple-macintosh:~ vijay$ hexdump /tmp/a 0000000 55 6e 74 65

我有一个奇怪的问题,我试图比较的两个Unicode变量看起来相同,但它们在二进制表示中不同。当我查看上传的文件时,它显示的文件名的二进制表示形式略有不同。这仅在从Safari浏览器上载时发生。我不是Unicode方面的专家,我对两个具有不同二进制Unicode表示但相同的字符串感到困惑

有没有人知道这是为什么?表示德语umlaut的额外字节实际上是什么意思

     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(umlaut)表示为75cc88。我不确定这些是否是乌姆劳特的独特代表。了解如何以可靠的方式比较这些文件名对我非常有帮助

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
有关参考,请参阅