<p>问题是因为在<code>Unicode</code>中,您可以使用单个字符或创建一些字符作为其他两个字符的组合,并且这两种情况在两个不同的位置。在一个位置,您将一些字符作为单个字符(使用单个代码),在另一个位置,您将字符作为其他两个字符(使用两个代码)的组合。当对两个字符串使用<code>len()</code>时,您甚至可以看到差异。在您的示例中,一个版本有lenght<code>53</code>,另一个版本有<code>52</code></p>
<p>似乎您可以使用带有选项<code>NFC</code>、<code>NFKC</code>、<code>NFD</code>、<code>NFKD</code>之一的<code>unicodedata.normalize()</code>将一个名称转换为另一个名称。所以你必须测试哪一个适合你</p>
<p>在一个方向上,您可能需要<code>NFC</code>或<code>NFKC</code>,在另一个方向上,您可能需要<code>NFD</code>或<code>NFKD</code></p>
<p>您还可以使用<code>unidecode</code>创建没有本机字符的文本:<code>fa(c)lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg</code>,但这可能对您没有多大用处</p>
<pre><code>import unicodedata
from unidecode import unidecode
a = 'fã©lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg'
b = 'fã©lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg'
print('a:', a)
print('b:', b)
print(' - len -')
print('len(a):', len(a))
print('len(b):', len(b))
print(' - encode -')
print('a.encode:', a.encode('utf-8'))
print('b.encode:', b.encode('utf-8'))
print(' - a == normalize(b) -')
print('NFC: ', a == unicodedata.normalize('NFC', b) )
print('NFKC:', a == unicodedata.normalize('NFKC', b) )
print('NFD: ', a == unicodedata.normalize('NFD', b) )
print('NFKD:', a == unicodedata.normalize('NFKD', b) )
print(' - b == normalize(a) -')
print('NFC: ', b == unicodedata.normalize('NFC', a) )
print('NFKC:', b == unicodedata.normalize('NFKC', a) )
print('NFD: ', b == unicodedata.normalize('NFD', a) )
print('NFKD:', b == unicodedata.normalize('NFKD', a) )
print(' - unidecode -')
print('a:', unidecode(a))
print('b:', unidecode(b))
</code></pre>
<p>结果:</p>
<pre><code>a: fã©lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg
b: fã©lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg
- len -
len(a): 53
len(b): 52
- encode -
a.encode: b'fa\xcc\x83\xc2\xa9lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg'
b.encode: b'f\xc3\xa3\xc2\xa9lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg'
- a == normalize(b) -
NFC: False
NFKC: False
NFD: True
NFKD: True
- b == normalize(a) -
NFC: True
NFKC: True
NFD: False
NFKD: False
- unidecode -
a: fa(c)lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg
b: fa(c)lix-del-marle_nu-agenouill-sur-fond-bleu-1937.jpg
</code></pre>
<hr/>
<p>只有当我必须将MacOS文件传输到其他系统时,我才会遇到其他两个字符的组合</p>
<hr/>
<p>文件:<a href="https://docs.python.org/3/library/unicodedata.html" rel="nofollow noreferrer">unicodedata</a></p>
<p>Python街:<a href="https://www.pythonsheets.com/notes/python-unicode.html" rel="nofollow noreferrer">Unicode</a></p>
<p>堆栈溢出:<a href="https://stackoverflow.com/questions/16467479/normalizing-unicode">Normalizing Unicode</a></p>