Заполните яму кодировки китайских символов python2.x

Python рептилия

задний план

Python всегда считался одним из самых элегантных языков. Это может помочь вам избавиться от монотонной и повторяющейся работы, такой как подсчет всевозможных болезненных данных, импорт и экспорт таблиц, требуемых начальником, и так далее. Все, что вам нужно сделать, это написать, запустить скрипт на Python, выпить чашку чая и дождаться результатов.

Вот как появилась эта статья: когда я использовал scrapy для обхода данных, я столкнулся с проблемой кодировки китайских символов Python 2.x. Раньше я мало знал об этой проблеме, но на этот раз я столкнулся с ней снова и сказал что я должен погасить долг.Чтобы понять, что такое кодировка символов.

Предварительные знания

ASCII

Прежде всего, нам нужно уяснить, что вся информация в компьютере в конечном счете представлена ​​в двоичном виде, каждый двоичный бит (бит) имеет два состояния 0 и 1, 8 двоичных битов называются байтом (байтом), который может представлять 256 штат.

Будучи пионером в компьютерной области, Соединенные Штаты разработали набор кодов символов в 1960-х годах, используя двоичный код для представления английских букв, цифр и некоторых символов.ASCII

Unicode

С развитием компьютеров вскоре появились требования к кодированию других языков, и однобайтовая кодировка ASCII больше не может соответствовать требованиям из-за ограниченного количества символов, которые могут быть представлены. Чтобы не конфликтовать с кодировкой ASCII, способные страны начали разрабатывать отдельную кодировку -- используя больше байтов для представления символов, Китай сформулировал gb2312

Однако вместе с этим возникает ряд проблем, вызванных увеличением количества схем кодирования символов. Так появился Юникод. Он использует один и тот же набор символов для представления символов всех языков и решает ряд проблем, вызванных разными схемами кодирования символов.

Тогда давайте поговорим о проблеме китайской кодировки Python 2.x.

Позвольте мне сначала дать вам простой, который является более распространенным

Содержимое файла test.py:

#!/usr/bin/python
city = '京'
print city

Запускаем python test.py, результат показан на рисунке:

Тогда почему это? Если вы не знаете, значит, вы невнимательно читали предварительную часть. Это связано с тем, что файл .py по умолчанию использует кодировку ASCII, китайские символы не входят в диапазон, который они представляют, и сообщается об ошибке.

Решено путем изменения кодировки по умолчанию test.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
city = '京'
print city

После прочтения 🌰 давайте снова посмотрим на str и unicode

И str, и unicode являются подклассами basestring. но,Строго говоря, unicode — это строка в прямом смысле, а str — это байт-код — последовательность, состоящая из байтов, закодированных в unicode.. Последний скриншот, чтобы развеять все сомнения, s==s2

Благодаря этому 🌰 вы поймете разницу между str и unicode, мама больше не будет беспокоиться об искаженных символах или ошибках при обработке китайских символов (будь то unicode для str или str для unicode) и избегайте следующих операций

  • 1. Декодировать китайский юникод, незаконно
  • 2. Закодируйте китайскую строку str, что является незаконным.

Сказав так много, покажи мне свой код (косая улыбка)🌰:

#!/usr/bin/python
# -*- coding: utf-8 -*-
u_z = u'京'
s_z = '京'
u=u'jing'
s='jing'

print u_z
print s_z
print repr(u_z)
print repr(s_z)

print '=================='

print u
print s
print repr(u)
print repr(s)

print '=================='

print u.decode()
print s.encode()

print u_z.decode()
print s_z.encode()

небольшой совет

  • В рамках одного проекта унифицированная кодировка символов исходного файла и унифицированная кодировка системных символов для предотвращения искажения символов.
    #!/usr/bin/python
    # -*- coding:utf8 -*-
    import sys
    reload(sys)
    sys.setdefaultencoding("utf-8")
    
  • попробуй использовать юникод
  • Массивы, словари в БД раньше были json.dumps
  • Формат декодирования и кодирования унифицирован

Что ж, это мое понимание кодировки китайских символов python2.x, надеюсь, это поможет вам.

Воспроизведение без моего разрешения запрещено. В статье есть упущения и поверхностность, прошу меня поправить