UnicodeDecodeError, который происходит с json в Python в Windows, но не Mac

На окнах у меня есть следующая проблема:

>>> 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 и кодеками, но напрасно.

1
задан ventolin 30 May 2010 в 00:35
поделиться

1 ответ

Что показывает repr (строка) на каждом компьютере? На моем Mac апостроф отображается как \ xc2 \ xb4 (кодировка utf8, 2 байта), поэтому, конечно, кодек utf8 может справиться с этим; в вашей Windows он явно не делает этого, поскольку в нем говорится о проблеме трех байтов - поэтому в Windows у вас должна быть другая кодировка, отличная от utf8, для вашей консоли.

Ваша общая проблема заключается в том, что в Python pre-3 вам не следует вводить байтовую строку ( "...." , как вы использовали, а не u ".... ") с содержимым, отличным от ascii (если только это не является escape-строкой): это может (в зависимости от того, как настроен сеанс) дать сбой напрямую или произвести байты, в соответствии с некоторыми кодеками, установленными как кодек по умолчанию, которые не являются точными ожидаемых байтов (поскольку вы не знаете, какой именно кодек используется по умолчанию). Используйте явные литералы Unicode

string = u"Don´t Forget To Breathe"

, и все будет в порядке (или, если у вас возникнут какие-либо проблемы, они возникнут прямо во время этого назначения, после чего мы можем перейти к вопросу «как установить кодировку по умолчанию для моих интерактивные сеансы », если это то, что вам нужно).

2
ответ дан 3 September 2019 в 00:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: