我在理解读取文本和将文本写入文件(Python 2.4)方面有些脑残。
# The string, which has an a-acute in it.
ss = u'Capit\xe1n'
ss8 = ss.encode('utf8')
repr(ss), repr(ss8)
(“u’Capit\xe1n’”, “‘Capit\xc3\xa1n’”)
print ss, ss8
print >> open('f1','w'), ss8
>>> file('f1').read()
'Capit\xc3\xa1n\n'
所以我在我最喜欢的编辑器 f2 中输入 Capit\xc3\xa1n
。
然后:
>>> open('f1').read()
'Capit\xc3\xa1n\n'
>>> open('f2').read()
'Capit\\xc3\\xa1n\n'
>>> open('f1').read().decode('utf8')
u'Capit\xe1n\n'
>>> open('f2').read().decode('utf8')
u'Capit\\xc3\\xa1n\n'
我在这里不明白什么?显然,我缺少一些重要的魔法(或良好的感觉)。一种输入文本文件以进行正确转换的方法是什么?
我在这里真正无法理解的是 UTF-8 表示的意义是什么,如果你不能真正让 Python 识别它,当它来自外部时。也许我应该只是 JSON 转储字符串,并改用它,因为它有一个 asciiable 表示!更重要的是,当从文件进入时,Python 会识别和解码这个 Unicode 对象的 ASCII 表示吗?如果是这样,我该如何得到它?
>>> print simplejson.dumps(ss)
'"Capit\u00e1n"'
>>> print >> file('f3','w'), simplejson.dumps(ss)
>>> simplejson.load(open('f3'))
u'Capit\xe1n'
原文由 Gregg Lind 发布,翻译遵循 CC BY-SA 4.0 许可协议
在符号
u'Capit\xe1n\n'
(在3.x中应该只是'Capit\xe1n\n'
,并且 必须 在3.0和3.1中)中,\xe1
只代表一个字符。\x
是转义序列,表示e1
是十六进制的。在文本编辑器
Capit\xc3\xa1n
写入文件意味着它实际上包含\xc3\xa1
。这些是 8 个字节,代码会全部读取它们。我们可以通过显示结果来看到这一点:相反,只需在编辑器中输入
á
之类的字符,然后它应该处理转换为 UTF-8 并保存它。在 2.x 中,实际上包含这些反斜杠转义序列的字符串可以使用
string_escape
编解码器进行解码:结果是
str
以 UTF-8 编码,其中重音字符由在原始字符串中写入\\xc3\\xa1
的两个字节表示。要获得unicode
结果,请使用 UTF-8 再次解码。In 3.x, the
string_escape
codec is replaced withunicode_escape
, and it is strictly enforced that we can onlyencode
from astr
到bytes
和decode
从bytes
到str
2b8f1425790f58e2b84d —d。unicode_escape
需要以 --- 开头以处理转义序列(bytes
,它 会添加 它们);然后它将生成的\xc3
和\xa1
视为 字符 转义而不是 字节 转义。因此,我们必须做更多的工作: