Как вставить юникод в текст
Перейти к содержимому

Как вставить юникод в текст

  • автор:

Юникод, внутреннее устройство строк

Этот раздел более подробно описывает, как устроены строки. Такие знания пригодятся, если вы намерены работать с эмодзи, редкими математическими символами, иероглифами, и т.д.

Как мы уже знаем, строки в JavaScript основаны на Юникоде: каждый символ представляет из себя последовательность байтов из 1-4 байтов.

JavaScript позволяет нам вставить символ в строку, указав его шестнадцатеричный Юникод с помощью одной из этих трех нотаций:

    \xXX Вместо XX должны быть указаны две шестнадцатеричные цифры со значением от 00 до FF . В этом случае \xXX – это символ, Юникод которого равен XX . Поскольку нотация \xXX поддерживает только две шестнадцатеричные цифры, ее можно использовать только для первых 256 символов Юникода. Эти 256 символов включают в себя латинский алфавит, большинство основных синтаксических символов и некоторые другие. Например, «\x7A» – это то же самое, что «z» (Юникод U+007A ).

alert( "\x7A" ); // z alert( "\xA9" ); // ©, символ авторского права

✪ Как вводить интересные спецсимволы в текст

Первый способ довольно стар и появился еще во времена MS-DOS, когда Alt-коды стали популярны и получили широкое распространение, он поддерживается операционными системами до сих пор. Этот способ уступает разнообразием спецсимволов, однако при этом имеет более широкую поддержку, так как сайты, использующие устаревшие кодировки, могут не поддерживать символы Unicode.

Символы с Alt-кодами

Ниже представлена таблица с некоторыми интересными символами, которые могут разнообразить ваше сообщение и сделать его немного необычным.

Справа от каждого символа указан соответствующий ему цифровой код. Для ввода символа необходимо зажать клавишу Alt и не отпуская её набрать на цифровой клавиатуре число соответствующее коду символа.

Таким образом, если зажать Alt и набрать 26 получим следующий знак: →.

Список символов:

Символ Номер
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
§ 21
22
23
24
25
26
27
28
29
30
31
Символ Номер
127
Ç 128
ü 129
é 130
â 131
ä 132
à 133
å 134
ç 135
ê 136
ë 137
Ö 153
Ü 154
¢ 155
£ 156
¥ 157
158
ƒ 159
í 161
º 167
¿ 168
169
¬ 170
½ 171
¼ 172
¡ 173
« 174
» 175
176
177
178
179
180
181
Символ Номер
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
Символ Номер
214
215
216
217
218
219
220
221
222
223
α 224
ß 225
Ω 234
δ 235
236
φ 237
ε 238
239
240
± 241
242
243
244
245
÷ 246
247
° 248
249
· 250
251
252
² 253
254
255

Unicode символы

Unicode — это современный формат кодирования символов в котором представлено множество языков одновременно, а помимо букв имеется множество специальных знаков: математических, технических, идеограмм и других.

Ниже расположена таблица с наиболее интересными и часто встречающимися знаками. Для использоваться, необходимо выделить символ на странице, скопировать его с помощью комбинации клавиш Ctrl+C или при помощи правой клавиши мыши, после чего вставить в нужном месте нажав сочетание клавиш Ctrl+V.

Значки

Стрелки

Математические символы

Геометрические фигуры

Блоковые элементы

Рамки

Еще значки

Обсуждение
Ещё написал(а):
Гость написал(а):

1. Шрифты в любом случае векторные, поэтому ничего хранить не нужно. При этом, на мой взгляд, набор шрифтовых смайлов ограничен и скучен, они интересны именно в контексте их использования на сайтах, таких как Вконтакте.
Сайтам легко интегрировать такие смайлы, а большая часть работы остается за кадром, в недрах браузера.

2. Не ясно зачем нам base64? Это изначально немного ущербная кодировка, связанная с огромным наследием нынешнего Интернета, но никак не благо. Она не прозрачна (нельзя увидеть что находится внутри закодированного текста) и существенно увеличивает объем передаваемых данных.

Гость написал(а):

По технологии вставки символов у меня остались вопросы:

1. Давно пора создавать специальные интернет-сайты, с которых любой смайлик или символ можно скачивать в любом масштабе. Масштаб указывается прямо в ссылке.

На сайте хранить эти символы в векторном формате, а раздавать и в растровых: gif, jpg, png, …

Кроме этого, понадобятся пользовательские каталоги со ссылками на эти универсальные векторные образы. Образ на сайте один, а ссылок на него может быть много (из разных каталогов).

В этих же ссылочных деревьях хранить ссылки на обычные рисунки пользователя, которые не обязательно должны храниться на этом же сайте. Но хранить на спец-сайте удобнее, т.к. действует сервис масштабирования, и система рейтингов…

На основе этих рейтингов сайт сможет создавать тематические подборки (всё те же ссылочные деревья или каталоги): автоматически группируя лучшие.

2. Вопрос о способах применения кодировки base64. Пока не готов его сформулировать… ☻ Но буду рад, если кто-нибудь из экспертов расскажет об этой технологии.

Юникод для чайников

logo

Сам я не очень люблю заголовки вроде «Покемоны в собственном соку для чайников\кастрюль\сковородок», но это кажется именно тот случай — говорить будем о базовых вещах, работа с которыми довольно часто приводить к купе набитых шишек и уйме потерянного времени вокруг вопроса — «Почему же оно не работает?». Если вы до сих пор боитесь и\или не понимаете Юникода — прошу под кат.

Зачем?

Главный вопрос новичка, который встречается с впечатляющим количеством кодировок и на первый взгляд запутанными механизмами работы с ними (например, в Python 2.x). Краткий ответ — потому что так сложилось 🙂

Кодировкой, кто не знает, называют способ представления в памяти компьютера (читай — в нулях-единицах\числах) цифр, буков и всех остальных знаков. Например, пробел представляется как 0b100000 (в двоичной), 32 (в десятичной) или 0x20 (в шестнадцатеричной системе счисления).

Так вот, когда-то памяти было совсем немного и всем компьютерам было достаточно 7 бит для представления всех нужных символов (цифры, строчный\прописной латинский алфавит, куча знаков и так называемые управляемые символы — все возможные 127 номеров были кому-то отданы). Кодировка в это время была одна — ASCII. Шло время, все были счастливы, а кто не был счастлив (читай — кому не хватало знака «©» или родной буквы «щ») — использовали оставшиеся 128 знаков на свое усмотрение, то есть создавали новые кодировки. Так появились и ISO-8859-1, и наши (то есть кириличные) cp1251 и KOI8. Вместе с ними появилась и проблема интерпретации байтов типа 0b1******* (то есть символов\чисел от 128 и до 255) — например, 0b11011111 в кодировке cp1251 это наша родная «Я», в тоже время в кодировке ISO-8859-1 это греческая немецкая Eszett (подсказывает Moonrise) «ß». Ожидаемо, сетевая коммуникация и просто обмен файлами между разными компьютерами превратились в чёрт-знает-что, несмотря на то, что заголовки типа ‘Content-Encoding’ в HTTP протоколе, email-письмах и HTML-страницах немного спасали ситуацию.

В этот момент собрались светлые умы и предложили новый стандарт — Unicode. Это именно стандарт, а не кодировка — сам по себе Юникод не определяет, как символы будут сохранятся на жестком диске или передаваться по сети. Он лишь определяет связь между символом и некоторым числом, а формат, согласно с которым эти числа будут превращаться в байты, определяется Юникод-кодировками (например, UTF-8 или UTF-16). На данный момент в Юникод-стандарте есть немного более 100 тысяч символов, тогда как UTF-16 позволяет поддерживать более одного миллиона (UTF-8 — и того больше).

Ближе к делу!

Естественно, есть поддержка Юникода и в Пайтоне. Но, к сожалению, только в Python 3 все строки стали юникодом, и новичкам приходиться убиваться об ошибки типа:

>>> with open('1.txt') as fh: s = fh.read() >>> print s кощей >>> parser_result = u'баба-яга' # присвоение для наглядности, представим себе, что это результат работы какого-то парсера >>> parser_result + s 
Traceback (most recent call last): File "", line 1, in parser_result + s UnicodeDecodeError: 'ascii' codec can't decode byte 0xea in position 0: ordinal not in range(128) 
>>> str(parser_result) 
Traceback (most recent call last): File "", line 1, in str(parser_result) UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128) 

Давайте разберемся, но по порядку.

Зачем кто-то использует Юникод?

Почему мой любимый html-парсер возвращает Юникод? Пусть возвращает обычную строку, а я там уже с ней разберусь! Верно? Не совсем. Хотя каждый из существующих в Юникоде символов и можно (наверное) представить в некоторой однобайтовой кодировке (ISO-8859-1, cp1251 и другие называют однобайтовыми, поскольку любой символ они кодируют ровно в один байт), но что делать если в строке должны быть символы с разных кодировок? Присваивать отдельную кодировку каждому символу? Нет, конечно, надо использовать Юникод.

Зачем нам новый тип «unicode»?

Вот мы и добрались до самого интересного. Что такое строка в Python 2.x? Это просто байты. Просто бинарные данные, которые могут быть чем-угодно. На самом деле, когда мы пишем что-нибудь вроде:

>>> x = 'abcd' >>> x 'abcd' 

интерпретатор не создает переменную, которая содержит первые четыре буквы латинского алфавита, но только последовательность

('a', 'b', 'c', 'd')

с четырёх байт, и латинские буквы здесь используются исключительно для обозначения именно этого значения байта. То есть ‘a’ здесь просто синоним для написания ‘\x61’, и ни чуточку больше. Например:

>>> '\x61' 'a' >>> struct.unpack('>4b', x) # 'x' - это просто четыре signed/unsigned char-а (97, 98, 99, 100) >>> struct.unpack('>2h', x) # или два short-а (24930, 25444) >>> struct.unpack('>l', x) # или один long (1633837924,) >>> struct.unpack('>f', x) # или float (2.6100787562286154e+20,) >>> struct.unpack('>d', x * 2) # ну или половинка double-а (1.2926117739473244e+161,) 

И ответ на вопрос — зачем нам «unicode» уже более очевиден — нужен тип, который будет представятся символами, а не байтами.

Хорошо, я понял чем есть строка. Тогда что такое Юникод в Пайтоне?

«type unicode» — это прежде всего абстракция, которая реализует идею Юникода (набор символов и связанных с ними чисел). Объект типа «unicode» — это уже не последовательность байт, но последовательность собственно символов без какого либо представления о том, как эти символы эффективно сохранить в памяти компьютера. Если хотите — это более высокой уровень абстракции, чем байтовый строки (именно так в Python 3 называют обычные строки, которые используются в Python 2.6).

Как пользоваться Юникодом?
>>> u'abc' u'abc' 
>>> 'abc'.decode('ascii') u'abc' 
>>> unicode('abc', 'ascii') u'abc' 
'\x61' -> кодировка ascii -> строчная латинская "a" -> u'\u0061' (unicode-point для этой буквы) или '\xe0' -> кодировка c1251 -> строчная кириличная "a" -> u'\u0430' 

Как из юникод-строки получить обычную? Закодировать её:

>>> u'abc'.encode('ascii') 'abc' 

Алгоритм кодирования естественно обратный приведенному выше.

Запоминаем и не путаем — юникод == символы, строка == байты, и байты -> что-то значащее (символы) — это де-кодирование (decode), а символы -> байты — кодирование (encode).

Не кодируется 🙁

Разберем примеры с начала статьи. Как работает конкатенация строки и юникод-строки? Простая строка должна быть превращена в юникод-строку, и поскольку интерпретатор не знает кодировки, от использует кодировку по умолчанию — ascii. Если этой кодировке не удастся декодировать строку, получим некрасивую ошибку. В таком случае нам нужно самим привести строку к юникод-строке, используя правильную кодировку:

>>> print type(parser_result), parser_result баба-яга >>> s = 'кощей' >>> parser_result + s 
Traceback (most recent call last): File "", line 1, in parser_result + s UnicodeDecodeError: 'ascii' codec can't decode byte 0xea in position 0: ordinal not in range(128) 
>>> parser_result + s.decode('cp1251') u'\xe1\xe0\xe1\xe0-\xff\xe3\xe0\u043a\u043e\u0449\u0435\u0439' >>> print parser_result + s.decode('cp1251') баба-ягакощей >>> print '&'.join((parser_result, s.decode('cp1251'))) баба-яга&кощей # Так лучше :) 

«UnicodeDecodeError» обычно есть свидетельством того, что нужно декодировать строку в юникод, используя правильную кодировку.

Теперь использование «str» и юникод-строк. Не используйте «str» и юникод строки 🙂 В «str» нет возможности указать кодировку, соответственно кодировка по умолчанию будет использоваться всегда и любые символы > 128 будут приводить к ошибке. Используйте метод «encode»:

>>> print type(s), s кощей >>> str(s) 
Traceback (most recent call last): File "", line 1, in str(s) UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)
>>> s = s.encode('cp1251') >>> print type(s), s кощей

«UnicodeEncodeError» — знак того, что нам нужно указать правильную кодировку во время превращения юникод-строки в обычную (или использовать второй параметр ‘ignore’\’replace’\’xmlcharrefreplace’ в методе «encode»).

Хочу ещё!

Хорошо, используем бабу-ягу из примера выше ещё раз:

>>> parser_result = u'баба-яга' #1 >>> parser_result u'\xe1\xe0\xe1\xe0-\xff\xe3\xe0' #2 >>> print parser_result áàáà-ÿãà #3 >>> print parser_result.encode('latin1') #4 баба-яга >>> print parser_result.encode('latin1').decode('cp1251') #5 баба-яга >>> print unicode('баба-яга', 'cp1251') #6 баба-яга 
  1. Что имеем на входе? Байты, которые IDLE передает интерпретатору. Что нужно на выходе? Юникод, то есть символы. Осталось байты превратить в символы — но ведь надо кодировку, правда? Какая кодировка будет использована? Смотрим дальше.
  2. Здесь важной момент:
>>> 'баба-яга' '\xe1\xe0\xe1\xe0-\xff\xe3\xe0' >>> u'\u00e1\u00e0\u00e1\u00e0-\u00ff\u00e3\u00e0' == u'\xe1\xe0\xe1\xe0-\xff\xe3\xe0' True 

как видим, Пайтон не заморачивается с выбором кодировки — байты просто превращаются в юникод-поинты:

>>> ord('а') 224 >>> ord(u'а') 224 
>>> parser_result.encode('latin1') '\xe1\xe0\xe1\xe0-\xff\xe3\xe0' 
>>> parser_result.encode('latin1').decode('cp1251') u'\u0431\u0430\u0431\u0430-\u044f\u0433\u0430' 

Есть ещё способ использования «u»» для представления, например, кириллицы, и при этом не указывать кодировку или нечитабельные юникод-поинты (то есть «u’\u1234’»). Способ не совсем удобный, но интересный — использовать unicode entity codes:

>>> s = u'\N\N\N\N\N' >>> print s кощей 

Ну и вроде всё. Основные советы — не путать «encode»\«decode» и понимать различия между байтами и символами.

Python 3

Здесь без кода, ибо опыта нет. Свидетели утверждают, что там всё значительно проще и веселее. Кто возьмется на кошках продемонстрировать различия между здесь (Python 2.x) и там (Python 3.x) — респект и уважуха.

Полезно

Раз уж мы о кодировках, порекомендую ресурс, который время-от-времени помогает побороть кракозябры — http://2cyr.com/decode/?lang=ru.

Unicode HOWTO — официальный документ о том где, как и зачем Юникод в Python 2.x.

Спасибо за внимание. Буду благодарен за замечания в приват.

Вставить Unicode или ASCII символ в текст

В Windows имеется утилита «Таблица символов», из которой можно скопировать и вставить в свой текст символы которых нет на клавиатуре. Чтобы ее открыть, можно или нажать Win+R и ввести charmap, или нажать Win+Q и найти ее в поиске.

Вставка символа в текст сочетанием клавиш

Если символ входит в ASCII таблицу, его код отображается справа, внизу окна — Alt+0169. То есть, например, чтобы вставить в текст символ © , нужно: зажать Alt, набрать на цифровом блоке клавиатуры 0169, отпустить Alt.

Unicode код символа, отображается внизу слева. Вставить его можно следующим способом: написать в тексте u+00a9 (или просто 00a9) и удерживая Alt, нажать клавишу X. Введенный код преобразуется в символ ©.

Если символ входит только в Unicode таблицу, то и вставить его можно только в файл в Unicode кодировке.
Не все текстовые редакторы поддерживают преобразование Unicode кодов в символы клавишами.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *