У меня какая-то мозговая ошибка в понимании чтения и записи текста в файл (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'
Поэтому я набираю Capit\xc3\xa1n
в моем любимом редакторе, в файле f2.
Тогда:
>>> 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 вывести строку и использовать ее вместо этого, так как это имеет превосходное представление! Более того, существует ли ASCII-представление этого объекта Unicode, которое Python будет распознавать и декодировать при входе из файла? Если так, как я могу получить это?
>>> print simplejson.dumps(ss)
'"Capit\u00e1n"'
>>> print >> file('f3','w'), simplejson.dumps(ss)
>>> simplejson.load(open('f3'))
u'Capit\xe1n'