UnicodeDecodeError, которая возникает с json в python на Windows, но не на Mac - PullRequest
1 голос
/ 30 мая 2010

В Windows у меня возникает следующая проблема:

>>> 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 Ответ

2 голосов
/ 30 мая 2010

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

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

string = u"Don´t Forget To Breathe"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...