我有一个文件,其名称包含没有几个字节的悬空字节\xd0:
touch `echo -en 'test\xd0.txt'`

当我通过 python 查找目录中的文件列表时,它会为我将其解码为这样的 unicode 字符串:
>>> os.listdir('.')
['test\udcd0.txt']
通过这个 unicode 字符串,它允许我使用该文件:
>>> open('test\udcd0.txt', 'r').read()
'' # (логичный результат для пустого файла)
但是在这里,例如,它不再打印它:
>>> print('test\udcd0.txt')
UnicodeEncodeError: 'utf-8' codec can't encode character '\udcd0' in position 4: surrogates not allowed
\xd0问题:结果如何\udcd0?某处是否有明确定义的算法,或者它只是一个 CPython 实现细节?我可以以类似的方式自己编码和解码这些破碎的字符串吗?
为了进行比较,Python 2 中的 listdir(默认情况下所有字符串都是字节字符串)给出了我'test\xd0.txt',而不会以任何方式破坏存储在文件系统上的文件名。
问题是在不同的地方,编解码器有不同的默认值。这还不是刚刚完成。
在这里,您需要了解符号的性质。
这些字符不会以任何方式转换为 UTF-8,它们根本不被视为字符。Python 使用内部编解码器在输出到屏幕时会为此序列生成错误。
文件管理器按预期处理错误:
最有趣的是这个孤独的角色是如何翻译的。从 sishnoy
fstatden 接收字节。内部实现使用替代替代。这发生在 C 代码中,其中编解码器行为设置如下:这样做是为了在按名称访问文件时,名称中的字节不会因编码转换而丢失。
该函数
print已根据python 的默认行为进行了修改:errors='strict'您必须确定如何处理非字符。如果向编解码器添加选项,则可以无错误地显示文本
errors='replace'使用 python2,这不会发生,因为 python 中的字符串不是 unicode。没有重新编码 - 没问题。
PS。