Окончательное решение проблемы тарабарщины Python (TL; DR)
Есть особенно интересное явление: когда у нас болит голова от программирования на питоне, почти все статьи, которые мы ищем, будут первыми, кто будет жаловаться. Потом беспомощно писать решения (решения не решения). Эта проблема действительно не проблема новичка, даже у ветеранов Python с десятком лет часто болит голова. Китай и зарубежные страны одинаковы. Проверьте этого эксперта по Python наОбъясните искаженное получасовое видео с Конгресса PyConЯ узнал, он все дал ему обратно в кодирование, Dizu, eNcoding, Decoding, и на этапе он отказался отвечать, и можно представить себе всю сложность этой проблемы.
Я думаю, что почти каждый pythoner будет тратить часть своей жизни на кодирование. Можно сказать, что если не решить эту проблему полностью, она всегда будет рушиться. Просто посмотрите на некоторые из статей, которые я написал:
- Всю ночь жаловался на Python 2.x
- Понимание китайских иероглифов Python: str(), repr(), print
- Понимание китайской кодировки в Python: unicode, utf-8, gbk
С ворчанием покончено, вот заметки из блокнота ipython, которые я в очередной раз потратил целых два дня на тестирование и доработку.ipynb
unicode
bytes
type(字符串)
str
bytes
utf-8
gb2312
encoding
decoding
unicode
bytes
encoding
bytes
unicode
decoding
UnicodeDecodeError: 'ascii' codec can't decode
显性
显性
utf-8
response.text
response.content
decoding
response.text
ISO8859
decoding
unicode(b'你好‘)
b'你好'.decode('utf-8')
unicode()
декодировать, вместо того, чтобы использовать.decode('utf-8')
, ибо явно декодировать имя не получится, если исходник действительно (скорее всего так и есть)ISO8859
и т. д., то неправильное декодирование обязательно приведет к искажению символов или прямой ошибке программы. Запомнить!
Так что только здесьunicode()
расшифровка. Например:
Резюме этого этапа: обязательно помните, что весь текст используется единообразноstr
строка формата
Просто следите за связанными сетевыми операциями, такими как запросы, пока вы контролируете строки из внешних источников, унифицированных какstr
, в остальном хорошо сказано!
Ниже приведен полный тест от получения сетевых ресурсов (включая китайские веб-страницы, которые считаются кодированными по ISO8850 по запросам) до локальных операций и сохранения в локальные файлы.
import requests
r = requests.get('http://pycoders-weekly-chinese.readthedocs.io/en/latest/issue5/unipain.html')
# write a webpage to local file
with open('test.html', 'w') as f:
f.write( r.content )
# read from a local html file
with open('test.html', 'r') as f:
ss = f.read()
Готово! Эффект следующий: