На окнах у меня есть следующая проблема:
>>> string = "Don´t Forget To Breathe"
>>> import json,os,codecs
>>> f = codecs.open("C:\\temp.txt","w","UTF-8")
>>> json.dump(string,f)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python26\lib\json\__init__.py", line 180, in dump
for chunk in iterable:
File "C:\Python26\lib\json\encoder.py", line 294, in _iterencode
yield encoder(o)
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 3-5: invalid data
(Заметьте апостроф неASCII в строке.)
Однако мой друг, на его Mac (также использующий python2.6), может пробежать это как бриз:
> string = "Don´t Forget To Breathe"
> import json,os,codecs
> f = codecs.open("/tmp/temp.txt","w","UTF-8")
> json.dump(string,f)
> f.close(); open('/tmp/temp.txt').read()
'"Don\\u00b4t Forget To Breathe"'
Почему это? Я также попытался использовать UTF-16 и UTF-32 с json и кодеками, но напрасно.
Что показывает repr (строка)
на каждом компьютере? На моем Mac апостроф отображается как \ xc2 \ xb4
(кодировка utf8, 2 байта), поэтому, конечно, кодек utf8 может справиться с этим; в вашей Windows он явно не делает этого, поскольку в нем говорится о проблеме трех байтов - поэтому в Windows у вас должна быть другая кодировка, отличная от utf8, для вашей консоли.
Ваша общая проблема заключается в том, что в Python pre-3 вам не следует вводить байтовую строку ( "...."
, как вы использовали, а не u ".... "
) с содержимым, отличным от ascii (если только это не является escape-строкой): это может (в зависимости от того, как настроен сеанс) дать сбой напрямую или произвести байты, в соответствии с некоторыми кодеками, установленными как кодек по умолчанию, которые не являются точными ожидаемых байтов (поскольку вы не знаете, какой именно кодек используется по умолчанию). Используйте явные литералы Unicode
string = u"Don´t Forget To Breathe"
, и все будет в порядке (или, если у вас возникнут какие-либо проблемы, они возникнут прямо во время этого назначения, после чего мы можем перейти к вопросу «как установить кодировку по умолчанию для моих интерактивные сеансы », если это то, что вам нужно).