Прошлое и настоящее кодировки символов

задняя часть Python Windows Unicode

предисловие

Многие программисты не очень хорошо разбираются в кодировке символов, хотя наверняка знают такие термины и понятия, как ASCII, UTF8, GBK, Unicode и т. д., но в процессе написания кода все равно сталкиваются с различными странными проблемами кодировки. Java - это искаженные символы. , и наиболее часто встречающиеся ошибки кодирования при разработке Python, такие как: UnicodeDecodeError, UnicodeEncodeError, почти каждый разработчик Python столкнется с такой проблемой, нет никакого способа сделать это, эта статья начинается с происхождения символа кодирование, описывает Как решать проблемы с кодированием в программировании?Поняв эту статью, вы сможете легко находить, анализировать и решать проблемы, связанные с кодированием символов.

Когда дело доходит до «кодировки символов», мы должны сначала понять, что такое кодировка и почему она закодирована.

что такое кодировка

Любой, кто изучал компьютер, знает, что компьютер может обрабатывать только двоичные данные, состоящие из 0 и 1. Любая информация, которую люди видят и слышат с помощью компьютера, включая текст, видео, аудио и изображения, хранится в компьютере. и работают в бинарной форме. Компьютеры хорошо обрабатывают двоичные данные, но люди слишком слабы для двоичных данных. Чтобы снизить стоимость связи между людьми и компьютерами, люди решают пронумеровать каждый символ. Например, число для буквы А равно 65, и соответствующее двоичное число "01000001". Когда A хранится в компьютере, оно заменяется на 01000001. Когда оно должно быть загружено и отображено в файле или на веб-странице для просмотра, двоичное число преобразуется в символ A В этом процессе будут задействованы данные в различных форматах преобразования.

кодирование (кодировать)Это процесс преобразования данных из одной формы в другую. Это набор алгоритмов. Например, преобразование здесь символа А в 01000001 является процессом кодирования.декодировать (декодировать)Это обратный процесс кодирования. Сегодня мы говорим о кодировке символов, которая представляет собой алгоритм преобразования между символами и двоичными данными. Шифрование и дешифрование в криптографии иногда называют кодированием и декодированием, но это выходит за рамки данной статьи.

gitchat-encode-decode.jpg

что такое набор символов

Набор символов — это набор всех абстрактных символов, поддерживаемых системой. Это общий термин для различных знаков и символов.Общие наборы символов включают набор символов ASCII, набор символов GBK, набор символов Unicode и т. д. Различные наборы символов задают ограниченное количество символов.Например, набор символов ASCII содержит только латинские буквы, GBK содержит китайские символы, а набор символов Unicode содержит все текстовые символы в мире.

Некоторые люди не могут не спросить, какова связь между набором символов и кодировкой символов? Не волнуйся, спускайся первым

ASCII: происхождение наборов символов и кодировок символов

Первый в мире компьютер был спроектирован и разработан в 1945 году двумя профессорами Пенсильванского университета, Мочли и Эккертом.Американцы разработали первый набор символов и стандарт кодирования для компьютеров, названный ASCII (American Standard Code). код для обмена информацией), всего 128 символов и соответствующие отношения двоичного преобразования. 128 символов включают 26 букв (верхний и нижний регистр), которые могут отображаться, 10 цифр, знаки препинания и специальные управляющие символы, которые являются общими символов в английском и западноевропейских языках, этих 128 символов более чем достаточно для представления одним байтом, потому что один байт может представлять 256 символов, поэтому в настоящее время используются только 7 бит байта, а старший бит используется в качестве проверка паритета. Поэтому, как показано ниже, символы в нижнем регистре. а соответствует 01100001, а заглавная буква А соответствует 01000001.

ascii

ASCII набор символовЭто 128 символов, состоящих из букв, цифр, знаков препинания и управляющих символов (возврат каретки, перевод строки, возврат). ASCIIКодировка символовпредставляет собой набор правил (алгоритмов), которые преобразуют эти 128 символов в двоичные данные, которые могут быть распознаны компьютером. Теперь мы можем ответить на предыдущий вопрос. Вообще говоря, набор символов также определяет набор правил кодирования символов с тем же именем. Например, ASCII определяет набор символов и кодировку символов. Конечно, это не абсолютно. Например, Юникод определяет только символы .Set, а соответствующие кодировки символов — UTF-8, UTF-16.

ASCII был сформулирован Американским национальным институтом стандартов и окончательно доработан в 1967 году. Первоначально он был американским национальным стандартом, а затем был определен Международной организацией по стандартизации (ISO) в качестве международного стандарта, известного как стандарт ISO 646, применимый к все латинские алфавиты.

EASCII: расширенный код ASCII

С непрерывной популяризацией компьютеров компьютеры стали использоваться в таких странах, как Западная Европа, и тогда в западноевропейских языках до сих пор существует множество символов, не входящих в набор символов ASCII, что вызвало большие ограничения на их использование в компьютеры, как и в Китае, вы можете использовать только английский язык, как и в общении с людьми. Поэтому они думали о способах расширения набора символов ASCII, думая, что ASCII использует только первые 7 бит байта, а если используется еще и восьмой бит, количество символов, которые можно представить, равно 256. Это более поздняя версия EASCII (Extended ASCII, расширенный американский стандартный код обмена информацией).Символы, расширенные кодом EASCII, чем код ASCII, включают табличные символы, расчетные символы, греческие буквы и специальные латинские символы.

Тогда EASCII не сформировал единый стандарт.В каждой стране есть свои маленькие счеты, и все они хотят поднять шумиху из-за старшего байта.Например, MS-DOS и IBM PC используют каждый пользовательский кодированный набор символов.В хаотической ситуации , серия стандартов 8-битных наборов символов, разработанных совместно Международной организацией по стандартизации (ISO) и Международной электротехнической комиссией (IEC), называется ISO 8859, полное название которого — ISO/IEC 8859, основанный на ASCII. Таким образом, используются только 0xA0~0xFF (160~255 в десятичном формате) из 128 кодов, расширенных полностью схемой кодирования символов ASCII и ISO 8859. ISO 8859 — это общий термин для набора наборов символов, он содержит в общей сложности 15 наборов символов, а именно ISO 8859-1 ~ ISO 8859-15, ISO 8859-1 также называется Latin-1, это западноевропейский язык , другие Они представляют наборы символов, такие как Центральная Европа, Южная Европа и Северная Европа соответственно.

enter image description here

GB2312: набор символов, отвечающий потребностям китайцев.

Позже компьютеры начали популяризироваться в Китае, но одной из проблем, с которыми они столкнулись, были символы.Китайские иероглифы обширны и глубоки.Существует 3500 общеупотребительных китайских иероглифов, что значительно превышает диапазон символов, которые могут быть представлены ASCII. набор символов.Даже EASCII - капля в море.Комитет по управлению стандартизацией установил набор символов, называемыйGB2312, каждый символ китайского символа состоит из двух байтов.Теоретически он может представлять 65536 символов, но включает только 7445 символов, 6763 китайских символа и 682 других символа.В то же время он совместим с ASCII, символы, определенные в ASCII Занимает всего один байт пространства.

Китайские иероглифы, включенные в GB2312, охватывают 99,75% частоты использования в материковом Китае, но некоторые редкие и традиционные китайские иероглифы и иероглифы, используемые многими этническими меньшинствами, не могут быть обработаны.Кодировка символов GBK, GBK включает не только 27484 китайских иероглифов, но и также включает тибетский, монгольский, уйгурский и другие основные языки меньшинств. GBK использует неиспользуемое пространство кодирования в GB2312 для расширения, поэтому он полностью совместим с GB2312 и ASCII. И GB 18030 — это новейший набор символов, совместимый с GB 2312-1980 и GBK, включая в общей сложности 70 244 китайских символа, с использованием многобайтовой кодировки, каждый символ может состоять из 1, 2, 4 байтов, в некотором смысле он может содержать 161 10 000 символов, включая традиционные китайские иероглифы, а также японские и корейские символы, однобайтовые, совместимые с ASCII, двухбайтовые, совместимые со стандартом GBK.

Юникод: набор символов, объединяющий реки и озера.

Хотя у нас есть собственный набор символов и кодировка символов GBK, в мире все еще есть много стран со своими языками и символами, такими как JIS в Японии и BIG5 на Тайване.Общаться между разными странами очень сложно, потому что нет единого стандарта кодирования для одного и того же символа, который может храниться в двухбайтовых байтах в стране A и в 3 байтах в стране B, что подвержено проблемам кодирования, поэтому в 1991 году Международная организация по стандартизации и Консорциум Unicode организовали свои соответствующие проекты ISO/IEC 10646 (USC) и Unicode, оба из которых надеялись использовать один набор символов для унификации всех символов в мире, но вскоре обе стороны поняли, что миру не нужны два несовместимых набора символов. Так что у них была очень дружеская встреча по вопросу кодирования, и они решили объединить работу друг с другом.Хотя проект все еще существует независимо, каждый публикует свой собственный стандарт, но предпосылка состоит в том, что они должны оставаться совместимыми. Однако из-за Название Unicode легче запомнить, поэтому оно используется более широко и стало стандартом Unicode де-факто.

Выше приведен краткий обзор истории наборов символов. Теперь давайте сосредоточимся на Unicode. Unicode — это набор символов, который включает в себя все символы мира, и каждому символу соответствует уникальная кодовая точка. Внимание! Это не кодировка символов, это просто набор символов.Как кодировать символы Unicode могут быть UTF-8, UTF-16 или даже GBK. Например:

>>> a = u"好"
>>> a
u'\u597d'
>>> b = a.encode("utf-8")
>>> b
'\xe5\xa5\xbd'
>>>

>>> b = a.encode("gbk")
>>> b
'\xba\xc3'

Сам Unicode не определяет, представлен ли символ одним, тремя или четырьмя байтами. Unicode указывает только, что каждому символу соответствует уникальное значение кода (кодовая точка).Значение кода находится в диапазоне от 0000 до 10FFFF, всего 1 114 112 значений.Количество байтов, необходимых для фактического хранения, определяется конкретным форматом кодирования. Например, если символ «А» закодирован в UTF-8, он занимает всего 1 байт, если он закодирован в UTF-16, он занимает 2 байта, а если он закодирован в UTF-32, он занимает до 4 байт.

UTF-8: кодировка Unicode

Кодирование UTF (формат преобразования Unicode) и кодирование USC (универсальный набор кодированных символов) представляют собой два метода кодирования в системе кодирования Unicode и ISO/IEC 10646 соответственно. UCS делится на UCS-2 и UCS-4, а общие типы UTF: УТФ-8, УТФ-16, УТФ-32. Поскольку наборы символов Unicode и USC совместимы друг с другом, эти форматы кодирования также имеют соответствующие отношения эквивалентности.

UCS-2 использует два байта фиксированной длины для представления символа, а UTF-16 также использует два байта, но UTF-16 имеет переменную длину (многие ложные утверждения в Интернете говорят, что UTF-16 имеет фиксированную длину), когда два байта не могут быть представлены, он будет представлен 4 байтами, поэтому UTF-16 можно рассматривать как расширение на основе UCS-2. UTF-32 и USC-4 полностью эквивалентны, используя 4 байта для представления, очевидно, что этот метод тратит больше места.

Преимущество UTF-8 в том, что он использует от 1 до 4 байтов для представления символа в однобайтовых блоках.По первому байту можно судить, что кодировка UTF-8 символа имеет несколько байтов. Если первый байт начинается с 0, это должна быть однобайтовая кодировка, если он начинается со 110, это должна быть двухбайтовая кодировка, если он начинается с 1110, это должна быть трехбайтовая кодировка и т. д. . Все последующие байты многобайтовых кодов UTF-8 начинаются с 10, за исключением одиночных байтов.

Кодировка UTF-8 от 1 до 4 байт выглядит так:

0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  • Однобайтовый кодируемый диапазон Unicode: \u0000~\u007F (0~127)

  • Двухбайтовый кодируемый диапазон Unicode: \u0080~\u07FF (128~2047)

  • Трехбайтовый кодируемый диапазон Unicode: \u0800~\uFFFF (2048~65535)

  • Четырехбайтовый кодируемый диапазон Unicode: \u10000~\u1FFFFF (65536~2097151)

UTF-8 совместим с ASCII, что позволяет экономить место при передаче и хранении данных.Во-вторых, UTF-8 не нужно учитывать проблему больших и малых концов. Оба из них являются недостатками UTF-16. Однако для китайских символов UTF-8 использует 3 байта, а UTF-16 — всего 2 байта. Преимущество UTF-16 в том, что она очень быстро вычисляет длину строк и выполняет операции индексации. Java использует внутреннюю схему кодирования UTF-16. В то время как Python3 использует UTF-8. Кодировка UTF-8 более широко используется в Интернете.

Давайте взглянем на картинку. На следующей картинке показан тип кодировки символов, который можно выбрать при сохранении файлов на платформе Windows. Вы можете указать, какой формат кодировки используется системой для хранения файлов. ANSI — это расширение ISO 8859-1. .Причина, почему именно под Windows Есть поговорка, что кодировка Unicode на самом деле является неправильным методом представления Windows.Возможно, она использовалась до сих пор по историческим причинам.На самом деле она действительно представляет собой кодировку UTF-16, точнее, UTF -16 с прямым порядком байтов Что такое Что насчет прямого и прямого порядка байтов?

windows-encode.png

с прямым порядком байтов и с прямым порядком байтов

Big-endian — это порядок хранения данных в памяти. Режим Big-endian означает, что старший байт данных идет первым и сохраняется по младшему адресу памяти, что согласуется с методом чтения и записи человеком. данных хранится после.В старшем адресе памяти обратный порядок байтов обратный.Режим прямого байта означает, что старший байт данных хранится в старшем адресе памяти, а младший байт данные хранятся по младшему адресу памяти, например, шестнадцатеричное значение0x1234567Как написать порядок байтов с прямым порядком байтов и прямым порядком байтов:

bigendian

Что касается того, почему есть прямой и прямой порядок байтов? Для 16-битных или 32-битных процессоров, поскольку ширина регистра больше одного байта, должна возникнуть проблема, как расположить несколько байтов, потому что порядок чтения нескольких байтов в разных операционных системах разный, x86 и General OS (например, Windows, FreeBSD, Linux) используют режим с прямым порядком байтов. Но, например, Mac OS имеет обратный порядок байтов. Это приводит к существованию режима хранения с обратным порядком байтов и режима хранения с прямым порядком байтов, ни один из которых не лучше и не хуже.

Почему UTF-8 не нужно учитывать прямой и обратный порядок байтов?

Единицей кода UTF-8 является 1 байт, поэтому нет необходимости учитывать порядок следования байтов. Однако UTF-16 использует 2 байта для кодирования символов Unicode, а единицей кодирования являются два байта, поэтому вам необходимо учитывать проблему порядка байтов, поскольку какой из 2 байтов хранится в старшем порядке, а какой — в младшем. порядок нужно определить.

Кодировка символов в Python2

Теперь, когда с теорией наконец покончено, давайте поговорим о проблеме кодирования в Python, которая также является наиболее волнующей и наиболее часто встречающейся проблемой каждого разработчика Python.Рождение Python произошло на несколько лет раньше, чем рождение Unicode.Поэтому Python first Эта версия продолжалась до Python 2.7, а кодировка Python по умолчанию — ASCII.

>>> import sys
>>> sys.getdefaultencoding()
'ascii'

Таким образом, в исходном коде Python, чтобы иметь возможность нормально сохранять китайские символы, вы должны сначала указать utf

8 или gbk формат

# coding=utf-8

或者是:

#!/usr/bin/python
# -*- coding: utf-8 -*-

ул и юникод

Знаки мы вводили раньше.Необходимо повторить разницу между знаками и байтами.Знак-это символ.Например,символом можно назвать китайский иероглиф,букву,цифру и знак препинания,а байт- символ.Двоичная последовательность, преобразованная после кодирования, байт составляет 8 бит. Например, символ «p» сохраняется на жестком диске в виде строки двоичных данных 01110000, занимающей один байт. Байты используются для хранения и передачи по сети, а символы используются для отображения и удобочитаемости.

В Python2 представление символов и байтов очень тонкое, а границы между ними размыты.В Python2 строки делятся на два типа: unicode и str. По сути, тип str представляет собой двоичную последовательность байтов, а строка типа Unicode — это символ. В следующем примере кода видно, что «Zen» типа str печатается как шестнадцатеричная \xec\xf8, соответствующая двоичная последовательность байтов. Это «11101100 11111000».

>>> s = '禅'
>>> s
'\xec\xf8'
>>> type(s)
<type 'str'>

И символ юникода, соответствующий u"Zen" типа юникода, равен u'\u7985'

>>> u = u"禅"
>>> u
u'\u7985'
>>> type(u)
<type 'unicode'>

Если мы хотим сохранить символы юникода в файлы или передать их в сеть, нам нужно преобразовать их в двоичные типы str посредством обработки кодирования, поэтому строки python предоставляют метод encode для преобразования из юникода в str и наоборот.

python2-str

encode

>>> u = u"禅"
>>> u
u'\u7985'
>>> u.encode("utf-8")
'\xe7\xa6\x85'

decode

>>> s = "禅"
>>> s.decode("utf-8")
u'\u7985'
>>>

Многие новички не могут вспомнить, использовать ли кодирование или декодирование для преобразования между str и unicode.Если вы помните, что str на самом деле является строкой двоичных данных, а unicode — это символ (символ), кодирование (кодирование) заключается в том, чтобы поставить процесс преобразования символов (символов) в двоичные данные, поэтому при преобразовании из unicode в str используется метод encode, и наоборот.

encoding always takes a Unicode string and returns a bytes sequence, and decoding always takes a bytes sequence and returns a Unicode string".

После выяснения отношения преобразования между str и unicode, давайте посмотрим, когда возникают ошибки UnicodeEncodeError и UnicodeDecodeError.

UnicodeEncodeError

UnicodeEncodeError возникает, когда строка юникода преобразуется в последовательность байтов str, давайте посмотрим на пример, сохраним строку строк юникода в файл

# -*- coding:utf-8 -*-
def main():
    name = u'Python之禅'
    f = open("output.txt", "w")
    f.write(name)

журнал ошибок

UnicodeEncodeError: 'ascii' codec can't encode characters in position 6-7: ordinal not in range(128)

Почему я получаю UnicodeEncodeError?

Потому что при вызове метода записи программа будет кодировать символы в бинарные байтовые последовательности, и будет происходить процесс преобразования кодировки из юникода в строку.Программа сначала определит тип строки.Если это строка, то она будет напрямую записывать в файл. Кодирование не требуется, поскольку строка типа str сама по себе является двоичной последовательностью байтов. Если строка имеет тип Unicode, он сначала вызовет метод encode для преобразования строки Unicode в двоичный тип str перед ее сохранением в файл.В Python2 метод encode по умолчанию использует ascii для encde.

эквивалентно:

>>> u"Python之禅".encode("ascii")

Однако мы знаем, что набор символов ASCII содержит только 128 латинских букв, исключая китайские символы, поэтому кодек ascii не может кодировать символы. Чтобы правильно использовать encode, необходимо указать набор символов, содержащий китайские символы, например: UTF-8, GBK.

>>> u"Python之禅".encode("utf-8")
'Python\xe4\xb9\x8b\xe7\xa6\x85'

>>> u"Python之禅".encode("gbk")
'Python\xd6\xae\xec\xf8'

Таким образом, чтобы правильно записать строку юникода в файл, вы должны заранее преобразовать строку в кодировку UTF-8 или GBK.

def main():
    name = u'Python之禅'
    name = name.encode('utf-8')
    with open("output.txt", "w") as f:
        f.write(name)

Или напишите строку типа str напрямую

def main():
    name = 'Python之禅'
    with open("output.txt", "w") as f:
        f.write(name)

Конечно, есть несколько способов правильно записать юникодную строку в файл, но принцип один и тот же, который здесь не приводится, это тот же самый принцип записи строки в базу данных и передачи ее в сеть

UnicodeDecodeError

UnicodeDecodeError возникает, когда последовательность байтов типа str декодируется в строку типа unicode.

>>> a = u"禅"
>>> a
u'\u7985'
>>> b = a.encode("utf-8")
>>> b
'\xe7\xa6\x85'
>>> b.decode("gbk")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'gbk' codec can't decode byte 0x85 in position 2: incomplete multibyte sequence

Когда последовательность байтов '\xe7\xa6\x85', сгенерированная после кодирования UTF-8, преобразуется в строку Unicode путем декодирования GBK, возникает ошибка UnicodeDecodeError, поскольку (для китайских символов) кодировка GBK занимает только два байта, а UTF-8 занимает 3 байта, при конвертации с GBK есть лишний байт, поэтому его нельзя распарсить. Ключ к тому, чтобы избежать UnicodeDecodeError, заключается в том, чтобы кодировать и декодировать с одним и тем же типом кодирования.

Это также отвечает упомянутому в начале статьи символу «дзен», который может занимать 3 байта или 2 байта при сохранении в файл, в зависимости от формата кодировки, указанного при кодировании.

Другой пример UnicodeDecodeError

>>> x = u"Python"
>>> y = "之禅"
>>> x + y
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
>>>

Когда строки str и unicode выполняют операцию +, Python будет неявно преобразовывать (декодировать) последовательность байтов типа str в тот же тип unicode, что и x, но Python использует для преобразования кодировку ascii по умолчанию и символы ASCII. , поэтому сообщается об ошибке. эквивалентно:

>>> y.decode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

Правильный способ - найти кодировку символов, содержащую китайские символы, например UTF-8 или GBK, для явного декодирования y в тип Unicode.

>>> x = u"Python"
>>> y = "之禅"
>>> y = y.decode("utf-8")
>>> x + y
u'Python\u4e4b\u7985'

Последовательность строк и байтов в Python3

Python3 полностью рефакторил кодировку строк и символов, что совершенно несовместимо с Python2.В то же время многие проекты, которые хотят перейти на Python3, доставили много неприятностей.Python3 устанавливает кодировку системы по умолчанию на UTF-8, а символы и последовательности двоичных байтов более четко различаются, представленные как str и bytes соответственно. Все текстовые символы представлены типом str, str может представлять все символы набора символов Unicode, а двоичные байтовые данные представлены новым типом данных, bytes, хотя в Python2 также есть тип bytes, но это всего лишь один из них. псевдоним ул.

str

>>> a = "a"
>>> a
'a'
>>> type(a)
<class 'str'>

>>> b = "禅"
>>> b
'禅'
>>> type(b)
<class 'str'>

bytes

В Python3 добавление 'b' перед символьными кавычками ясно указывает на то, что это объект типа байтов. Фактически это набор данных, состоящий из двоичных последовательностей байтов. Тип байтов может быть символами в диапазоне ASCII и другими шестнадцатеричные символы, символьные данные в формате ASCII, но не могут быть представлены не-ASCII-символами, такими как китайский.

>>> c = b'a'
>>> c
b'a'
>>> type(c)
<class 'bytes'>

>>> d = b'\xe7\xa6\x85'
>>> d
b'\xe7\xa6\x85'
>>> type(d)
<class 'bytes'>
>>>

>>> e = b'禅'
  File "<stdin>", line 1
SyntaxError: bytes can only contain ASCII literal characters.

Операции, предоставляемые типом bytes, такие же, как и str, поддерживают такие операции, как фрагментация, индексация и основные числовые операции. Но данные типа str и bytes не могут быть выполнены+операция, хотя это возможно в python2.

>>> b"a"+b"c"
b'ac'
>>> b"a"*2
b'aa'
>>> b"abcdef\xd6"[1:]
b'bcdef\xd6'
>>> b"abcdef\xd6"[-1]
214

>>> b"a" + "b"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to str

Сравнение байтов и символов python2 и python3

python2 python3 Представление конвертировать эффект
str bytes байт encode место хранения
unicode str персонаж decode показывать

Суммировать

  1. Кодирование символов - это, по сути, процесс преобразования символов в байты.

  2. Эволюция набора символов: ascii, eascii, ios8895-x, gb2312... Unicode

  3. Юникод — это набор символов, а соответствующие форматы кодировки — UTF-8, UTF-16.

  4. Существуют большие и малые конечные точки при хранении последовательностей байтов.

  5. Символы и байты в python2 представлены типами unicode и str соответственно.

  6. Символы и байты в python3 представлены как str и bytes соответственно.

Ссылка на ссылку


Эта статья была впервые опубликована на GitChat и не может быть воспроизведена без разрешения. Для перепечатки, пожалуйста, свяжитесь с GitChat.


Запись: «Лю Чжицзюнь: Анализ прошлого и настоящего кодирования символов»


enter image description here

enter image description here