Форум программистов, компьютерный форум, киберфорум
Python: Научные вычисления
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/34: Рейтинг темы: голосов - 34, средняя оценка - 4.68
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
1

Представление символов в юникоде

08.10.2016, 16:48. Показов 6853. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Друзья! Быть может, не совсем для питона, но в книжке по питону я нашёл такое утверждение. Вот смотрю на него как баран на новые ворота и ничего не могу понять.

Книга "Programming in Python 3, Mark Summerfield". Привожу фотку, так как не могу напечатать нужный символ ("A с кружком вверху"):

И опять. Первый способ представления символа это [0хЕ2, 0x84, ОхАВ]. Это чего вообще? Тут же русским языком написано, что этот символ имеет номер 0x00C5. Всё. Этот символ имеет только ОДИН номер в кодировке UTF-8. Хорошо, написано, что три номера. Хотелось бы эти номера увидеть, то есть прочесть что-то вроде:
символ "A с кружком вверху" представлен номерами такими-то: 0xXXXX, 0xXXXX, 0xXXXX (тремя разными способами).
Но три списка вообще в уныние меня повергают. Это же не три номера, это же три каких-то списка, и что каждый из них представляет- одному Богу известно.

Ну не последовательно же писать символы из списка для получения нужного номера! То есть берём список [0хЕ2, 0x84, ОхАВ], переписываем числа по порядку, получаем 0хЕ284АВ. Это номер для представления символа "A с кружком вверху" в кодировке UTF-8? Минуточку, там всего 0XFFFF символов может быть представлено... Сижу, гадаю, в общем.

Так как же получить с помощью представленных списков символ "A с кружком вверху"? Спасибо. кто откликнется.
Миниатюры
Представление символов в юникоде  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2016, 16:48
Ответы с готовыми решениями:

Представление символов юникода
print (hex(ord('!'))) # Why is output 0x21 ? print ('\u0021') # output is '!' print ('\u0x21') #...

Код в юникоде надстрочных и подстрочных символов, введенных с клавиатуры в richtextedit
Есть richtextedit, куда пользователь вводит текст, в котором могут быть надстрочные и подстрочные...

Двоичное представление символов
Проблема такая: я прогаю скремблер, и проблема в том, что буквы при переводе дают семизначное...

Двоичное представление символов ASCII
например дана последовательность: 0110100001101001 где h=01101000 i=01101001 ]...

Бинарное представление символов кириллицы
Доброго времени суток, помогите разобраться. Имеется строка QString из нее мы берем первый элемент...

3
431 / 302 / 89
Регистрация: 03.12.2015
Сообщений: 738
09.10.2016, 11:10 2
Лучший ответ Сообщение было отмечено kravam как решение

Решение

Если не ошибаюсь, то примерно так:

Сначала придумали обычный Юникод с кодами до 0xFFFF. И в нем есть символ Å, который имеет код 0x00C5.

Чтобы хранить текст Юникод начали кодировать символы "в лоб", двумя байтами (UTF-16).

Потом поняли, что слишком много тратится байт (по два на символ) и придумали UTF-8, в котором коды 0-127 из Юникода представлены в виде одного байта со значениями от 0 до 127. А вот другие символы Юникода кодируются уже несколькими байтами (до 6 байт). Т.е. тексты на анлийском стали занимать меньше места (т.к. английские буквы кодируются одним байтом), а вот другие тексты стали чуть длиннее.

Набор байт, которые ты видишь это код UTF-8 в БИТАХ которого закодирован код Юникод. Как расшифровать - см. страницу вики UTF-8.

Потом еще хуже. Решили количество символов в Юникоде расширить. Сейчас их больше, чем 0xFFFF.
http://unicode-table.com/ru

Пришлось и UTF-16 переделывать из двубайтной кодировки в динамичную - то два байта, то три байта.
А "в лоб" коды Юникоды хранятся сейчас только в UTF-32 (четыре байта на символ), без всякого дополнительного кодирования.

Добавлено через 1 час 0 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
>>> bytes([0xe2, 0x84, 0xab]).decode('utf-8')
'A'
>>> bytes([0xc3, 0x85]).decode('utf-8')
'A'
>>> bytes([0x41, 0xcc, 0x8a]).decode('utf-8')
'A'
>>> '\u00c5'.encode('utf-8')
b'\xc3\x85'
>>> '\u00c5'.encode('utf-16')
b'\xff\xfe\xc5\x00'
>>> '\u00c5'.encode('utf-32')
b'\xff\xfe\x00\x00\xc5\x00\x00\x00'
Добавлено через 14 часов 0 минут
Один и тот же символ Unicode можно закодировать разными способами в UTF-8.
Но правильным считается самый короткий, а остальные варианты (называются overlong sequences) использоваться не должны.
1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
10.10.2016, 18:00  [ТС] 3
Я разобрался почему

1) 0xe2, 0x84, 0xab это символ "A с кружком вверху"
2) 0xc3, 0x85 это символ "A с кружком вверху"

Но почему 0x41, 0xcc, 0x8a это символ "A с кружком вверху", я понять не могу. То есть символ "A с кружком вверху" представлен тремя байтами. Зададимся вопросом- а каким должен быть первый байт? Прочтём здесь:

Количество байт, которое отводится под символ, всегда равно количеству идущих подряд старших бит со значением 1 в первом байте. Эти биты всегда завершаются битом со значением 0
То есть если символ представлен тремя байтами, то независимо ни от чего, первые 4 бита первого байта такие: 1110. А на самом деле 0x41, 0xcc, 0x8a это

010000011100110010001010

Первые 4 бита НЕ 1110, вот что странно! Почему так?
0
431 / 302 / 89
Регистрация: 03.12.2015
Сообщений: 738
10.10.2016, 21:41 4
Цитата Сообщение от kravam Посмотреть сообщение
Первые 4 бита НЕ 1110, вот что странно! Почему так?
Потому что это специальная последовательность из двух частей, которые объединились в один символ юникода.

01000001 - это обычный символ A

11001100 10001010 - специальный знак - кружок (диакритический знак), который влияет на другие буквы (код U+030A)

Цитата из вики:
Юникод позволяет создавать дополнительные сочетания любых букв с надстрочным кружком, набирая после них код для надстрочного кружка (U+030A)

Поэтому два таких символа идущих подряд дают "А с кружочком вверху"
1
10.10.2016, 21:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.10.2016, 21:41
Помогаю со студенческими работами здесь

Вывести двоичное представление суммы символов
В строку ввести последовательность "чисел"(10 функция). Вывести двоичное представление суммы...

представление символов в управляющих эскейп-последовательностях
прив! Еsc-последовательности могут представлять символы в ASCII-коде в 8-ом или 16-ом формате.....

Конвертировать машинное представление float в строку из 4 символов
Допустим, есть переменная X типа float, имеющая значение... да хотя бы -3.14. Машинным...

Visual Prolog. Представление символов и строк, операции над строками.
1. Разработать программу реализующую различные способы представления символов и строк, а также...

PHP - представление символов строки (utf-8) в виде массива значений байт
Здравствуйте друзья. Такая задача. Есть срока (utf-8) из латинских символов, цифр, а также знаков...

сохранение в юникоде
добрый вечер. не подскажите как можно сохранить текстовую информацию из tntmemo в текстовом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru