2016-09-05 5 views
2

Когда я пишу определенную строку в файл в бесконечном цикле, например:Python - file.write() вызывает китайский текст

file = open('txt.txt', 'w') 
while 1: 
    file.write('colour') 

Это дает мне все это китайский текст: Picture

Почему это происходит?

+1

Это работает для меня и может быть просто проблемой кодирования вашего текстового редактора. Вы пробовали просмотреть его в другой программе? Кроме того, было бы интересно, как выглядит чистый свалка ASCII. –

ответ

0

Вы можете получить тот же результат, скопировав вставку colour несколько раз в блокнот, а затем сохраните и перезагрузите файл. Нет ничего плохого в вашем коде на Python. Байты, записываемые в файл будут выглядеть следующим образом (в шестнадцатеричном):

63 CF 6C 6F 75 72 63 CF 6C 6F 75 72 ... 

Когда блокнот читает эти байты, необходимые угадать, что они представляют. Он идеально декодировал бы текст как utf-8 или ascii. Вместо этого он видит шаблон в байтах и ​​ошибочно полагает.

Я заметил, что каждая пара байтов соответствует одному китайскому символу. Это предполагает, что кодировка может быть utf-16. Следующий тест на питоне подтверждает, что это так:

>>> original = 'colour' * 100 
>>> original.encode('utf-8').decode('utf-16') 
\u6f63\u6f6c\u7275\... # repeating 

Этих кодовые точки соответствуют 潣, 潬 и 牵 что то же самое, что блокнот дисплеи. Поэтому проблема заключается в том, что блокнот неправильно декодирует ваши байты как utf-16 вместо utf-8. Это напоминает старую ошибку Bush hid the facts.

0

Я считаю, что ваша кодировка устанавливается как inproper по умолчанию (возможно на установке или на основе ваших настроек компьютеров)

вы можете изменить его:

import sys 
reload(sys) # Reload does the trick! 
sys.setdefaultencoding('UTF8') 

Проверить эту нить из для получения дополнительной информации Changing default encoding of Python?

+0

Нет, эта проблема не в конце python, это блокнот. –

+0

Хмм .... Это возможно. Я просто предположил, что нам нужно было услышать, что должен был сказать OP к предложению Обезьяны Сверхзвукового (что следует за вашей мыслью). – Ch1pCh4p

+0

Yup Обезьяна Сверхзвуковая была права. Нетрудно воспроизвести проблему, используя только блокнот или даже шестнадцатеричный редактор. Базы utf-8 неверно истолковываются как utf-16 в блокноте. –

Смежные вопросы