Как можно сохранить строку как «последовательность кодовых точек Юникода»?

1

Я пытаюсь понять строковое представление в python 3. Я видел различные объяснения на сайте и из книги, изучающей python Марка Лутца, что в python 3 объекты str хранятся в виде кодов Unicode. Цитируя книгу, "последовательности кода, отличные от Unicode, представляют собой последовательности из 8 бит байтов, которые, когда это возможно, печатаются с символами ASCII, а строки Unicode - это последовательности кодовых точек Unicode".

Я понимаю первую часть цитаты выше, но я не совсем понимаю вторую. Как последовательность символов, например, когда я набираю S = 'спам' в консоли, должна храниться как "Кодовые точки Unicode"?

Я считаю, что кодовые точки - это просто цифры, которые соответствуют символам, однако фактическая кодировка, которая выводит вас из этого числа в двоичное представление, зависит от используемой вами системы, такой как utf-8 или utf-32. Если это правда (пожалуйста, исправьте меня, если это не так!), То для того, чтобы моя переменная S была сохранена в памяти, компьютер должен в какой-то момент преобразовать "спам" в некоторую последовательность байтов. Итак, я перехожу от некоторых символов к двоичным, что является формой кодирования? Я видел еще одно сообщение, где объяснялось, что python не выполняет свою собственную кодировку.

Тогда я не понимаю, как моя переменная S может быть сохранена в памяти без прохождения какой-либо формы кодирования (а не только для хранения данных в виде кодовых точек, как объясняет книга)?

Заранее спасибо.

  • 0
    В памяти сохраняется кодовая точка Unicode, которая является положительным числом. Вы можете узнать это число, используя ord() для любого символа Юникода. Память в основном содержит двоичное представление этого числа
Теги:

1 ответ

1
Лучший ответ

Ваша цитата ничего не говорит о представлении строки в Unicode в памяти. В нем говорится: "Строки Unicode - это последовательности кодовых точек Unicode", а не "хранятся как".

Эта цитата - это описание значения строки Unicode, а не ее представления в памяти. Python имеет множество способов представления строк Unicode внутри, включая ASCII, UTF-8 и UTF-32. Он может даже содержать несколько представлений, хранящихся в одном и том же строковом объекте; в частности, PyUnicode_AsUTF8AndSize приведет к тому, что строка сохранит вспомогательное представление UTF-8, если только строка не является ASCII (которая уже является допустимой UTF-8), и строка может также содержать представление wchar_t.

Все представления памяти представляют собой детали реализации и могут быть изменены. Если вы хотите увидеть внутреннее представление, взгляните на Include/unicodeobject.h

  • 0
    Означает ли это, что когда я набираю S = 'spam', python использует определенную кодировку для сохранения последовательности символов в памяти?
  • 1
    @masiewpao: Для этой строки в текущем CPython, вероятно, ASCII.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню