Проблема с символами рейтинга у тем

Автор Сообщение
Gordon Freem@n ®

Стаж: 15 лет
Сообщений: 169
Откуда: Torrent.Ufanet.Ru

Создавать темы Gordon Freem@n ® написал(а)
10-Сен-2018 16:46
Скриншот прилагаю, что уже форум заточен под встроенные эмоджи в win10?
Профиль  ЛС 
Azat-777

Стаж: 16 лет
Сообщений: 917
Откуда: Russia

Создавать темы Azat-777 написал(а)
14-Сен-2018 10:41 (спустя 3 дня)
Windows 7. Все нормально
Профиль  ЛС 
Stalus

Стаж: 16 лет
Сообщений: 2469
Откуда: Amsterdam

Создавать темы Stalus написал(а)
15-Сен-2018 23:44 (спустя 1 день 13 часов)
Если коротко, форум не юзает эмодзи. Символы "палец вверх / палец вниз" - это символы из набора 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 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
Начало повторяется - 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 лет 2 месяца
Сообщений: 4

Создавать темы Станислав555 написал(а)
30-Сен-2018 13:50 (спустя 14 дней)
Как повысить рейтинг, написано скачать 10 GB,а скачивания не засчитываются!!!
Профиль  ЛС 
Stalus

Стаж: 16 лет
Сообщений: 2469
Откуда: Amsterdam

Создавать темы Stalus написал(а)
01-Окт-2018 03:08 (спустя 13 часов)
5273383Как повысить рейтинг, написано скачать 10 GB,а скачивания не засчитываются!!!
Добавил =)
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 23-Ноя 13:26
Часовой пояс: UTC + 5