Python использует три символа юникода для представления азиатской точки?Это странно? - PullRequest
0 голосов
/ 02 декабря 2011

Файл Python:

# -*- coding: utf-8 -*-

print u"。" 
print [u"。".encode('utf8')]

Производит:

。
['\xe3\x80\x82']

Почему python использует 3 символа для хранения моего 1 fullstop? Это действительно странно, если вы печатаете каждый из них по отдельности, все они тоже разные. Есть идеи?

Ответы [ 4 ]

7 голосов
/ 02 декабря 2011

В UTF-8 три байта (на самом деле не символы) используются для представления кодовых точек между U + 07FF и U + FFFF, таких как этот символ, IDEOGRAPHIC FULL STOP (U + 3002).

Попробуйте сбросить файл скрипта с помощью od -x. Вы должны найти те же три байта, которые используются для представления символа там.

1 голос
/ 02 декабря 2011

UTF-8 является многобайтовым символьным представлением , поэтому символы, не являющиеся ASCII, будут занимать более одного байта.

0 голосов
/ 02 декабря 2011

Последняя версия Unicode поддерживает более 109 000 символов в 93 различных сценариях.Математически, минимальное число байтов, которое вам нужно для кодирования этого количества кодовых точек, равно 3, поскольку это информация, содержащая 17 битов.(Unicode на самом деле резервирует 21-битный диапазон, но он по-прежнему умещается в 3 байта.) Поэтому можно разумно ожидать, что каждому символу потребуется 3 байта в наиболее простой кодируемой кодировке, в которой каждый символ представлен в видецелое число, использующее наименьшее возможное целое число байтов.(На самом деле, как указывает dan04, вам нужно 4 байта, чтобы получить всю функциональность Unicode.)

Обычный метод сжатия данных - использование коротких токенов для представления часто встречающихся элементов, даже если это означает, чтонечасто встречающимся элементам потребуются более длинные токены, чем они могли бы в противном случае.UTF-8 - это кодировка Unicode, которая использует этот подход для хранения текста, написанного на английском и других европейских языках, в меньшем количестве байтов за счет необходимости большего количества байтов для текста, написанного на других языках.В UTF-8 наиболее распространенным латинским символам требуется только 1 байт (UTF-8 перекрывается с ASCII для удобства пользователей на английском языке), а другим общим символам требуется только 2 байта.Но некоторым символам требуется 3 или даже 4 байта, что больше, чем им было бы необходимо в «наивной» кодировке.Конкретный символ, о котором вы спрашиваете, нуждается в 3 байтах в UTF-8 по определению.

В UTF-16, случается, этой кодовой точке потребуется только 2 байта, хотя другим символам потребуется 4 (естьнет 3-х байтовых символов в UTF-16).Если вы действительно заинтересованы в эффективности использования пространства, сделайте так, как предлагает Джон Мачин в своем комментарии, и используйте кодировку, разработанную таким образом, чтобы максимально экономить пространство для вашего языка.

0 голосов
/ 02 декабря 2011

Выглядит правильно, UTF-8 закодирован для меня. См. здесь для объяснения кодировки UTF-8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...