Проблема с символами рейтинга у тем
Автор
Сообщение
Gordon Freem@n ®
Стаж: 15 лет
Сообщений: 169
Откуда: Torrent.Ufanet.Ru
Скриншот прилагаю, что уже форум заточен под встроенные эмоджи в win10?
Azat-777
Стаж: 16 лет
Сообщений: 917
Откуда: Russia
Stalus
Стаж: 16 лет
Сообщений: 2469
Откуда: Amsterdam
Если коротко, форум не юзает эмодзи. Символы "палец вверх / палец вниз" - это символы из набора font-awesome.
Отсюда вопросы
Какой у вас браузер?
Пробовали очистить кеш браузера? Ctrl+F5 (спасибо, киро!)
Более длинный, но более развернутый ответ об эмодзи, юникоде и прочему. Текст ниже можно не читать xDМатчасть
Пришлось немного глубже заглянуть в кроличью нору :)
Исторический экскурс.
Когда-то давно трава была зеленая, земля плоская, а мониторы выпуклые.
Тогда все использовали для отображения 8-битные кодировки. Что это значило?
Был набор чисел, состоящих из 8 битов, то есть от 0000 0000 до 1111 11111 (всего 256 чисел).
Каждому такому двоичному числу в кодировке ставилась буква или символ.
Например,
0000 0000 - A
0000 0001 - B
...
Проблема была в том, что в каждой кодировке такие символы ставились свои (есть еще ASCII совместимые, но это отдельно).
То есть, допустим в кодировке latin1 символ с кодом DA (в двоичном виде 1101 1010) - это символ U, а в кодировке koi-8 - это символ з.
Отсюда крякозябры и наркомания при открывании текста в неправильной кодировке.
Пример крякозябр.
Из-за этих вот косяков:- всего 256 символов на кодировку;
- косячная раскодировка (крякозябры);
- дофига кодировок;
- фиг перекодируешь из одной в другую; (можно, но сложно).
и появилась идея юникода.
Юникод шагает по миру
Какая главная идея юникода? Давайте возьмем все буквы из языков мира, добавим разные символы, стрелки, мат. символы, хим. символы и т.п., и засунем все в одну большую таблицу.
Тут важная часть. Юникод - это стандарт. Т.е. просто документ с описанием того, какой код у какого символа.
Код обычно имеет вид U+шестнадцатеричный_код (16 бит). На основе стандарта создается его представление. Для юникода основные представления это UTF-8, UTF-16 и UTF-32.
Важно! В юникоде есть специальная область для частного использования. В ней не определен ни один символ. О ней чуть ниже.UTF-8. Туда и обратно
Чтение файла в UTF-8.
В представлении UTF-8 используется (в отличие от 8-битных кодировок) переменное количество байт на один символ. От одного до четырех.
Напомню, что 8 бит = 1 байт.
Как же это работает?
Берем первый байт.
Если первый бит в байте равен нулю, то для кодирования этого символа используется 1 байт. В итоге, получаем числа с 0000 0000 до 0111 1111. Всего 128 символов. Эти символы повторяют символы ASCII.
Если первый бит равен единице?
Все просто. Сколько бит в первом байте выставлено с единицу, столько байтов и юзаем. Причем второй и послед. байты начинаются с 10.
Примечание: Это признак того, что этот байт часть символа
Начинается с 110x xxxx? Юзаем два байта. То есть полностью это будет число 110xxxxx 10xxxxxx. Вот это один символ.
Начинается с 1110 xxxx? Юзаем три байта. То есть полностью это будет число 1110xxxx 10xxxxxx 10xxxxxx. Вот это один символ.
Начинается с 1111 0xxx? Юзаем четыре байта. То есть полностью это будет число 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx. Это также один символ.
Практические примеры.
Фраза "Hello, World!"
В двоичном виде это выглядит вот так.01001000 01100101 01101100 01101100 01101111 00101100 00100000 01010111 01101111 01110010 01101100 01100100 00100001Тут все довольно просто. Каждый байт начинается с нуля, а значит кодирует один символ.
Для примера 01001000.
Дополяем его до 16 бит - 0000 0000 0100 1000
И преобразуем в 16-ную систему счисления = 0048. То есть полностью это символ U+0048
Смотрим по таблице символов - https://unicode-table.com/ru/0048/ это буква H.
Остальное по аналогии.
Итоговая таблица:01001000 - H
01100101 - e
01101100 - l
01101100 - l (один и тот же символ кодирутся одним кодом, разумеется)
01101111 - 0
00101100 - ,
00100000 - пробел
01010111 - W
01101111 - o
01110010 - r
01101100 - l
01100100 - d
00100001 - !Пример посложнее. Фраза "Hello, мир!"
В двоичном виде:01001000 01100101 01101100 01101100 01101111 00101100 00100000 11010000 10111100 11010000 10111000 11010001 10000000 0010000101001000 01100101 01101100 01101100 01101111 00101100 00100000- эта часть повторяет пред. пример. Один байт = один символ
Оставшееся часть - 11010000 10111100 11010000 10111000 11010001 10000000 00100001
Начинается с 110 - значит берем 2 байта. 11010000 10111100 - один символ.
Как писал выше, каждый байт в многобайтовом символе начинается с 10.
А значит, нам надо отсечь начальные 110 и 10 в каждом след. байте = 11010000 10111100 = 10000111100
В шестнадцатеричном виде = 043C.
Смотрим на таблицу = https://unicode-table.com/ru/043c/ - буква м.
Оставшееся часть - 11010000 10111000 11010001 10000000 00100001
Опять начинает с 110 - значит снова 2 байта. 11010000 10111000 - буква и.
Оставшееся часть - 11010001 10000000 00100001
Повторяем. 110 = 2 байта. 11010001 10000000 - буква р.
Оставшееся часть - 00100001
Все просто. Это один символ.
Итоговая таблица:01001000 - H
01100101 - e
01101100 - l
01101100 - l (один и тот же символ кодирутся одним кодом, разумеется)
01101111 - 0
00101100 - ,
00100000 - пробел
11010000 10111100 - м
11010000 10111000 - и
11010001 10000000 - р
00100001 - !Еще пример. С иероглифами
Фраза "Hello, 世界!"
В двоичном виде -01001000 01100101 01101100 01101100 01101111 00101100 00100000 11100100 10111000 10010110 11100111 10010101 10001100 00100001Начало повторяется - 01001000 01100101 01101100 01101100 01101111 00101100 00100000
Оставшаяся часть - 11100100 10111000 10010110 11100111 10010101 10001100 00100001
Начинается с 1110 - значит берем 3 байта. 11100100 10111000 10010110 - один символ.
Как писал выше, каждый байт в многобайтовом символе начинается с 10.
А значит, нам надо отсечь начальные 1110 и 10 в каждом след. байте = 11100100 10111000 10010110 = 0100111000010110
В шестнадцатеричном виде = 4E16.
Смотрим на таблицу = https://unicode-table.com/ru/4E16/ - иероглиф 世.
Оставшаяся часть - 11100111 10010101 10001100 00100001
Опять таки начинает ся 1110 - берем 3 байта. 11100111 10010101 10001100 - иероглиф 界.
Оставшееся часть - 00100001
Все просто. Это один символ.
Итоговая таблица:01001000 - H
01100101 - e
01101100 - l
01101100 - l (один и тот же символ кодирутся одним кодом, разумеется)
01101111 - 0
00101100 - ,
00100000 - пробел
11100100 10111000 10010110 - 世
11100111 10010101 10001100 - 界
00100001 - !Скомбинируем все три примера:
Фраза "Hello, мой 世界!"
В двоичном виде -01001000 01100101 01101100 01101100 01101111 00101100 00100000 11010000 10111100 11010000 10111110 11010000 10111001 00100000 11100100 10111000 10010110 11100111 10010101 10001100 00100001Вместо разбора просто итоговая таблица:01001000 - H
01100101 - e
01101100 - l
01101100 - l (один и тот же символ кодирутся одним кодом, разумеется)
01101111 - 0
00101100 - ,
00100000 - пробел
11010000 10111100 - м
11010000 10111110 - о
11010000 10111001 - й
00100000 - пробел
11100100 10111000 10010110 - 世
11100111 10010101 10001100 - 界
00100001 - !Запись в UTF-8.
Допустим мы обкурились и захотели записать фразу "世界!" в файл в UTF-8.
Символ 世 в юникоде имеет код U+4E16. В двоичном виде 4Е16 это 100111000010110 (из шестнадцатеричного в бинарный)
Очевидно, что тут не один байт юзается. Это раз. Каждая часть байта в многобайтовом символе должна начинаться с 10. А значит у нас из 8 битов в байте остается 6 символов.
Берем число 100111000010110 и делим по шесть битов, начиная с конца. 100 111000 010110
Добавляем десятку в начало шестерки битов.
100 10111000 10010110
Дополняем нулем - 0100 10111000 10010110
Финальный штрих. Для трехбайтовых символов начало символа - 1110.
Символ 世 в юникоде = 1110 0100 10111000 10010110
Второй символ - 界
Юникод код - U+754C
В двоичном виде 111010101001100
Разбиваем по 6 символов с конца - 111 010101 001100
Дополняем 10-чками. 111 10010101 10001100
Дополняем нулем - 0111 10010101 10001100
Начальные биты - 1110 0111 10010101 10001100
Символ 界 в юникоде = 1110 0111 10010101 10001100
Последний символ восклицательный знак.
Его юникод код - U+0021
В двоичном виде - 100001
Шесть символов, так что все просто. Дополняем до одного байта нулями.
Символ "!" в юникоде = 00100001
В итоге фраза "世界!" в файле будет как:11100100 10111000 10010110 11100111 10010101 10001100 00100001Шрифты и шрифтовые движки.
Шрифт представялет собой по сути таблицу соответствия между юникод-символом и его графическим отображением.
Граф. отображение бывает двух видов - растровое и векторное. Первое - просто картинка. Второе - математическое описание того, как построить изображение символа. Для отображения векторных символов его надо растеризовать.
Шрифт - это просто файл, а вот для отображения с помощью шрифта используется шрифтовой движок.
То есть полностью схема вывода текста с опеределенным шрифтом выглядит так:
Текст - Раскодировние -> Шрифтовой движок (<- файл шрифта) -> Растрирование -> Вывод
Наш форум
1. Форум поддерживает юникод. Старая версия (до декабря 2017) использовала кодировку cp-1251 и не поддерживала юникод.
2. На форуме используется шрифты из проекта Font-Awesome.
Как говорилось выше, в юникоде есть спец. область для частного использования. Так вот, в шрифтах FA для них прописаны опеределенные символы, которые можно использовать. Фактически в css-коде просто добавляется юникод символ перед областью отображения этого символа.
Эмодзи и стикеры.
В современных ос и программах эмодзи и символы (спорт, еда, транспорт и т.д.) - это просто отображение юникод-символов. Причем комбинации юникод символов могут отображаться как один. Например,ребенок+женщина+мужчина = символ семьи.
Важно отличать стикер от эмодзи/символов. Эмодзи/символы - это просто символы юникода, в то время как стикер - файл с изображением.
Станислав555
Стаж: 6 лет 1 месяц
Сообщений: 4
Как повысить рейтинг, написано скачать 10 GB,а скачивания не засчитываются!!!
Stalus
Стаж: 16 лет
Сообщений: 2469
Откуда: Amsterdam
5273383Как повысить рейтинг, написано скачать 10 GB,а скачивания не засчитываются!!!Добавил =)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 21-Ноя 15:01
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
Gordon Freem@n ®
Стаж: 15 лет |
|
Скриншот прилагаю, что уже форум заточен под встроенные эмоджи в win10?
|
|
Azat-777
Стаж: 16 лет |
|
Stalus
Стаж: 16 лет |
|
Если коротко, форум не юзает эмодзи. Символы "палец вверх / палец вниз" - это символы из набора font-awesome.
Отсюда вопросы Какой у вас браузер? Пробовали очистить кеш браузера? Ctrl+F5 (спасибо, киро!) Более длинный, но более развернутый ответ об эмодзи, юникоде и прочему. Текст ниже можно не читать xD МатчастьПришлось немного глубже заглянуть в кроличью нору :)Исторический экскурс. Когда-то давно трава была зеленая, земля плоская, а мониторы выпуклые. Тогда все использовали для отображения 8-битные кодировки. Что это значило? Был набор чисел, состоящих из 8 битов, то есть от 0000 0000 до 1111 11111 (всего 256 чисел). Каждому такому двоичному числу в кодировке ставилась буква или символ. Например, 0000 0000 - A 0000 0001 - B ... Проблема была в том, что в каждой кодировке такие символы ставились свои (есть еще ASCII совместимые, но это отдельно). То есть, допустим в кодировке latin1 символ с кодом DA (в двоичном виде 1101 1010) - это символ U, а в кодировке koi-8 - это символ з. Отсюда крякозябры и наркомания при открывании текста в неправильной кодировке. Пример крякозябр. Из-за этих вот косяков:
Юникод шагает по миру Какая главная идея юникода? Давайте возьмем все буквы из языков мира, добавим разные символы, стрелки, мат. символы, хим. символы и т.п., и засунем все в одну большую таблицу. Тут важная часть. Юникод - это стандарт. Т.е. просто документ с описанием того, какой код у какого символа. Код обычно имеет вид U+шестнадцатеричный_код (16 бит). На основе стандарта создается его представление. Для юникода основные представления это UTF-8, UTF-16 и UTF-32. Важно! В юникоде есть специальная область для частного использования. В ней не определен ни один символ. О ней чуть ниже. UTF-8. Туда и обратноЧтение файла в UTF-8.В представлении UTF-8 используется (в отличие от 8-битных кодировок) переменное количество байт на один символ. От одного до четырех. Напомню, что 8 бит = 1 байт. Как же это работает? Берем первый байт. Если первый бит в байте равен нулю, то для кодирования этого символа используется 1 байт. В итоге, получаем числа с 0000 0000 до 0111 1111. Всего 128 символов. Эти символы повторяют символы ASCII. Если первый бит равен единице? Все просто. Сколько бит в первом байте выставлено с единицу, столько байтов и юзаем. Причем второй и послед. байты начинаются с 10. Примечание: Это признак того, что этот байт часть символа Начинается с 110x xxxx? Юзаем два байта. То есть полностью это будет число 110xxxxx 10xxxxxx. Вот это один символ. Начинается с 1110 xxxx? Юзаем три байта. То есть полностью это будет число 1110xxxx 10xxxxxx 10xxxxxx. Вот это один символ. Начинается с 1111 0xxx? Юзаем четыре байта. То есть полностью это будет число 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx. Это также один символ. Практические примеры. Фраза "Hello, World!" В двоичном виде это выглядит вот так. 01001000 01100101 01101100 01101100 01101111 00101100 00100000 01010111 01101111 01110010 01101100 01100100 00100001 Для примера 01001000. Дополяем его до 16 бит - 0000 0000 0100 1000 И преобразуем в 16-ную систему счисления = 0048. То есть полностью это символ U+0048 Смотрим по таблице символов - https://unicode-table.com/ru/0048/ это буква H. Остальное по аналогии. Итоговая таблица: 01001000 - H 01100101 - e 01101100 - l 01101100 - l (один и тот же символ кодирутся одним кодом, разумеется) 01101111 - 0 00101100 - , 00100000 - пробел 01010111 - W 01101111 - o 01110010 - r 01101100 - l 01100100 - d 00100001 - ! В двоичном виде: 01001000 01100101 01101100 01101100 01101111 00101100 00100000 11010000 10111100 11010000 10111000 11010001 10000000 00100001 01001000 01100101 01101100 01101100 01101111 00101100 00100000 Оставшееся часть - 11010000 10111100 11010000 10111000 11010001 10000000 00100001 Начинается с 110 - значит берем 2 байта. 11010000 10111100 - один символ. Как писал выше, каждый байт в многобайтовом символе начинается с 10. А значит, нам надо отсечь начальные 110 и 10 в каждом след. байте = 11010000 10111100 = 10000111100 В шестнадцатеричном виде = 043C. Смотрим на таблицу = https://unicode-table.com/ru/043c/ - буква м. Оставшееся часть - 11010000 10111000 11010001 10000000 00100001 Опять начинает с 110 - значит снова 2 байта. 11010000 10111000 - буква и. Оставшееся часть - 11010001 10000000 00100001 Повторяем. 110 = 2 байта. 11010001 10000000 - буква р. Оставшееся часть - 00100001 Все просто. Это один символ. Итоговая таблица: 01001000 - H 01100101 - e 01101100 - l 01101100 - l (один и тот же символ кодирутся одним кодом, разумеется) 01101111 - 0 00101100 - , 00100000 - пробел 11010000 10111100 - м 11010000 10111000 - и 11010001 10000000 - р 00100001 - ! Фраза "Hello, 世界!" В двоичном виде - 01001000 01100101 01101100 01101100 01101111 00101100 00100000 11100100 10111000 10010110 11100111 10010101 10001100 00100001 Оставшаяся часть - 11100100 10111000 10010110 11100111 10010101 10001100 00100001 Начинается с 1110 - значит берем 3 байта. 11100100 10111000 10010110 - один символ. Как писал выше, каждый байт в многобайтовом символе начинается с 10. А значит, нам надо отсечь начальные 1110 и 10 в каждом след. байте = 11100100 10111000 10010110 = 0100111000010110 В шестнадцатеричном виде = 4E16. Смотрим на таблицу = https://unicode-table.com/ru/4E16/ - иероглиф 世. Оставшаяся часть - 11100111 10010101 10001100 00100001 Опять таки начинает ся 1110 - берем 3 байта. 11100111 10010101 10001100 - иероглиф 界. Оставшееся часть - 00100001 Все просто. Это один символ. Итоговая таблица: 01001000 - H 01100101 - e 01101100 - l 01101100 - l (один и тот же символ кодирутся одним кодом, разумеется) 01101111 - 0 00101100 - , 00100000 - пробел 11100100 10111000 10010110 - 世 11100111 10010101 10001100 - 界 00100001 - ! Фраза "Hello, мой 世界!" В двоичном виде - 01001000 01100101 01101100 01101100 01101111 00101100 00100000 11010000 10111100 11010000 10111110 11010000 10111001 00100000 11100100 10111000 10010110 11100111 10010101 10001100 00100001 01001000 - H 01100101 - e 01101100 - l 01101100 - l (один и тот же символ кодирутся одним кодом, разумеется) 01101111 - 0 00101100 - , 00100000 - пробел 11010000 10111100 - м 11010000 10111110 - о 11010000 10111001 - й 00100000 - пробел 11100100 10111000 10010110 - 世 11100111 10010101 10001100 - 界 00100001 - ! Допустим мы обкурились и захотели записать фразу "世界!" в файл в UTF-8. Символ 世 в юникоде имеет код U+4E16. В двоичном виде 4Е16 это 100111000010110 (из шестнадцатеричного в бинарный) Очевидно, что тут не один байт юзается. Это раз. Каждая часть байта в многобайтовом символе должна начинаться с 10. А значит у нас из 8 битов в байте остается 6 символов. Берем число 100111000010110 и делим по шесть битов, начиная с конца. 100 111000 010110 Добавляем десятку в начало шестерки битов. 100 10111000 10010110 Дополняем нулем - 0100 10111000 10010110 Финальный штрих. Для трехбайтовых символов начало символа - 1110. Символ 世 в юникоде = 1110 0100 10111000 10010110 Второй символ - 界 Юникод код - U+754C В двоичном виде 111010101001100 Разбиваем по 6 символов с конца - 111 010101 001100 Дополняем 10-чками. 111 10010101 10001100 Дополняем нулем - 0111 10010101 10001100 Начальные биты - 1110 0111 10010101 10001100 Символ 界 в юникоде = 1110 0111 10010101 10001100 Последний символ восклицательный знак. Его юникод код - U+0021 В двоичном виде - 100001 Шесть символов, так что все просто. Дополняем до одного байта нулями. Символ "!" в юникоде = 00100001 В итоге фраза "世界!" в файле будет как: 11100100 10111000 10010110 11100111 10010101 10001100 00100001 Шрифт представялет собой по сути таблицу соответствия между юникод-символом и его графическим отображением. Граф. отображение бывает двух видов - растровое и векторное. Первое - просто картинка. Второе - математическое описание того, как построить изображение символа. Для отображения векторных символов его надо растеризовать. Шрифт - это просто файл, а вот для отображения с помощью шрифта используется шрифтовой движок. То есть полностью схема вывода текста с опеределенным шрифтом выглядит так: Текст - Раскодировние -> Шрифтовой движок (<- файл шрифта) -> Растрирование -> Вывод Наш форум 1. Форум поддерживает юникод. Старая версия (до декабря 2017) использовала кодировку cp-1251 и не поддерживала юникод. 2. На форуме используется шрифты из проекта Font-Awesome. Как говорилось выше, в юникоде есть спец. область для частного использования. Так вот, в шрифтах FA для них прописаны опеределенные символы, которые можно использовать. Фактически в css-коде просто добавляется юникод символ перед областью отображения этого символа. Эмодзи и стикеры. В современных ос и программах эмодзи и символы (спорт, еда, транспорт и т.д.) - это просто отображение юникод-символов. Причем комбинации юникод символов могут отображаться как один. Например,ребенок+женщина+мужчина = символ семьи. Важно отличать стикер от эмодзи/символов. Эмодзи/символы - это просто символы юникода, в то время как стикер - файл с изображением. |
|
Станислав555
Стаж: 6 лет 1 месяц |
|
Как повысить рейтинг, написано скачать 10 GB,а скачивания не засчитываются!!!
|
|
Stalus
Стаж: 16 лет |
|
5273383Как повысить рейтинг, написано скачать 10 GB,а скачивания не засчитываются!!! |
|
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 21-Ноя 15:01
Часовой пояс: UTC + 5