У меня возникает некоторая нехватка мозгов в понимании чтения и записи текста в файл (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'