быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
1 | |
Представление символов в юникоде08.10.2016, 16:48. Показов 6853. Ответов 3
Метки нет (Все метки)
Друзья! Быть может, не совсем для питона, но в книжке по питону я нашёл такое утверждение. Вот смотрю на него как баран на новые ворота и ничего не могу понять.
Книга "Programming in Python 3, Mark Summerfield". Привожу фотку, так как не могу напечатать нужный символ ("A с кружком вверху"): И опять. Первый способ представления символа это [0хЕ2, 0x84, ОхАВ]. Это чего вообще? Тут же русским языком написано, что этот символ имеет номер 0x00C5. Всё. Этот символ имеет только ОДИН номер в кодировке UTF-8. Хорошо, написано, что три номера. Хотелось бы эти номера увидеть, то есть прочесть что-то вроде: Ну не последовательно же писать символы из списка для получения нужного номера! То есть берём список [0хЕ2, 0x84, ОхАВ], переписываем числа по порядку, получаем 0хЕ284АВ. Это номер для представления символа "A с кружком вверху" в кодировке UTF-8? Минуточку, там всего 0XFFFF символов может быть представлено... Сижу, гадаю, в общем. Так как же получить с помощью представленных списков символ "A с кружком вверху"? Спасибо. кто откликнется.
0
|
08.10.2016, 16:48 | |
Ответы с готовыми решениями:
3
Представление символов юникода Код в юникоде надстрочных и подстрочных символов, введенных с клавиатуры в richtextedit Двоичное представление символов Двоичное представление символов ASCII Бинарное представление символов кириллицы |
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 минут
Один и тот же символ 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 с кружком вверху" представлен тремя байтами. Зададимся вопросом- а каким должен быть первый байт? Прочтём здесь:
Первые 4 бита НЕ 1110, вот что странно! Почему так?
0
|
431 / 302 / 89
Регистрация: 03.12.2015
Сообщений: 738
|
|
10.10.2016, 21:41 | 4 |
Потому что это специальная последовательность из двух частей, которые объединились в один символ юникода.
01000001 - это обычный символ A 11001100 10001010 - специальный знак - кружок (диакритический знак), который влияет на другие буквы (код U+030A) Цитата из вики: Юникод позволяет создавать дополнительные сочетания любых букв с надстрочным кружком, набирая после них код для надстрочного кружка (U+030A) Поэтому два таких символа идущих подряд дают "А с кружочком вверху"
1
|
10.10.2016, 21:41 | |
10.10.2016, 21:41 | |
Помогаю со студенческими работами здесь
4
Вывести двоичное представление суммы символов представление символов в управляющих эскейп-последовательностях Конвертировать машинное представление float в строку из 4 символов Visual Prolog. Представление символов и строк, операции над строками. PHP - представление символов строки (utf-8) в виде массива значений байт сохранение в юникоде Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |