Вы предполагаете, что для текста нет схемы кодирования. Это не верно. Есть десятки. Например, символ 噸
как последовательность октетов в нескольких популярных кодировках:
- UTF-8: 0xe5 0x99 0xb8
- UTF-16-BE: 0x56 0x78
- GB18030: 0x87 0x8d
- US-ASCII: невозможно, символ не принадлежит к репертуару символов кодировки
- Latin9: невозможно, персонаж не принадлежит к репертуару символов кодировки
Еще один: ß
- UTF-8: 0xc3 0x9f
- UTF-16-BE: 0x00 0xdf
- GB18030: 0x81 0x30 0x89 0x38
- US-ASCII: невозможно, символ не принадлежит к репертуару символов кодировки
- Latin9: 0xdf
Еще один: u
- UTF-8: 0x75
- UTF-16-BE: 0x00 0x75
- GB18030: 0x75
- US-ASCII: 0x75
- Латиница 9: 0x75
Проверьте это вручную! Загрузите эту веб-страницу, откройте ее в шестнадцатеричном редакторе и попытайтесь найти приведенные выше последовательности UTF-8.
Текстовый декодер принимает октеты в качестве входных данных и снова превращает их в пригодный для использования текст.
Вероятно, вы еще не заметили эту концепцию, потому что вы до сих пор работали только с латинскими символами, и хотя вы забыли о том, чтобы заботиться о кодировании и декодировании текста, все сработало без явных проблем. Это потому, что многие кодировки несколько обратно совместимы с дедуля US-ASCII, как вы можете видеть из последнего примера.
Python, как и многие другие языки программирования, в высокой степени придерживается Unicode, как и его модель обработки текста. Четкое разделение текста в виде последовательности символов или графем (в языке программирования) и текста в кодировке в виде серии октетов (вне языка программирования, в дисковых файлах, стандартное Очень необходимы потоки ввода-вывода, базы данных, аргументы командной строки, переменные среды, сетевые сокеты и т. Д.), Иначе вы получите неправильный результат, когда попытаетесь определить размер текста или попытаетесь разбить его на строку.
Текстовый кодек - это точная граница между этими мирами.