Вопросительный знак в ромбе

Вопросительный знак в ромбе

Заменяющий символ
�� �� �� ��
Характеристики Название replacement character Юникод U+FFFD HTML-код
  • или
  • UTF-16 0xFFFD
  • URL-код
  • %EF%BF%BD

    Заменяющий символ — символ, который используется, когда значение символа неизвестно или не может быть выражено в Юникоде.

    Этот символ находится на позиции U+FFFD [1] в группе «Специальные символы». Он — самый последний символ базовой многоязычной плоскости.

    Содержание

    Начертание [ править | править код ]

    Этот символ выглядит как чёрный ромб с вырезанным внутри вопросительным знаком [2] .

    Другое [ править | править код ]

    Его можно встретить в тексте, при неправильно настроенной кодировке символов. Он появляется в случае отсутствия символов, которые имеются в исходной кодировке, в целевой кодировке.

    Допустим, у нас есть текстовый файл, который содержит немецкое слово für в кодировке ISO 8859-1. Этот текстовый файл был передан по Интернету пользователю, у которого кодировка по умолчанию UTF-8. Первый байт ( 0x66 ) в пределах 0x00-0x7F, UTF-8 отображает его корректно в виде «f». Второй байт ( 0xFC ) — неподходящее значение для начала любого символа в UTF-8. И на месте этого байта браузер отобразит заменяющий символ с целью предупредить пользователя о том, что что-то пошло не так. Третий байт ( 0x72 ) также в пределах 0x00-0x7F, UTF-8 отображает его корректно в виде «r». И целое слово будет отображено как f�r .

    Текстовый редактор может отобразить заменяющий символ в UTF-8, и при отправке файла обратно, в ISO 8859-1 на месте этого символа получится бессвязное сочетание трёх символов: f � r . Такое произойдёт потому, что UTF-8 заменяющего символа — 0xEF 0xBF 0xBD . 0xEF — ï, 0xBF — ¿, 0xBD — ½, а вместе — �.

    Читайте также:  Что значат квадратики в сообщениях

    Если ваш компьютер вместо привычных русских букв отображает ромбики и знаки вопроса значит, во время установки windows вам неправильно указали язык, который необходимо применять для программ, не поддерживающих юникод. Для того что бы это исправить необходимо сделать следующее зайти в панель управления нажимаем на пуск — настройка — панель управления. Находим ярлычок Языки и региональные параметры

    заходим в них и выставляем в закладке Региональные параметры все как на картинке ниже.

    Теперь переходим во вкладку Дополнительно и в ней выставляем все так же как на картинке ниже и применяем.

    Нас попросят, перезагрузить компьютер перезагружаем и наслаждаемся нашим родным русским языком.

    Иногда нам требуется вывести не весь текст поста или комментария, а только его начало, и дать ссылку на продолжение «читать далее». Но стоит нам обрезать текст, как в конце его появляется (иногда) ромбик со знаком вопроса внутри (или рамка с мелкими циферками «1001» — в зависимости от браузера). Предлагаю разобраться, почему такое происходит, и устранить проблему.

    Очень популярной кодировкой текста в современном Вебе является «UTF-8». Например, именно её использует WordPress. Кодировка эта мультибайтная, благодаря чему в ней закодированы сотни алфавитов и разнообразные графические символы.

    Суть вопроса

    Но многие функции PHP писались изначально под однобайтные кодировки. Если при использовании таких функций (например, substr() ) указать, что вам нужно взять первые 100 символов строки, то функция возьмёт первые 100 байт. Однако, 1 байт в кодировке «utf-8» занимают далеко не все символы. К примеру, английские буквы и знаки препинания занимают 1 байт, а вот русские буквы занимают 2 байта.

    Не все функции учитывают такую особенность кодировки «utf-8», потому случается, что при обрезке строки последний символ «режется пополам». В итоге в конце строки мы имеем символ с номером, отображение которого браузером не предусмотрено — он и будет показан как вопросик в ромбе или какая-то другая непонятная неожиданная символика.

    Читайте также:  Pillars of eternity ручное животное для чего

    Бывают и другие странности. Например, функцией strlen() вы захотите определить длину строки. Если строка, к примеру, «PHP!» — проблем никаких, результат верный: 4. Но если строка: «Ура!» — результат будет: 7. Если разобраться, в этом нет ничего странного, поскольку кириллические символы занимают по 2 байта, а восклицательный знак — 1 байт. И, если мы захотим усечь строку «Ура!» до 3-х символов функцией substr() , то вместо ожидаемого «Ура» получим «У» и половинку буквы «р» в виде вопросика в ромбе.

    Решение

    Для устаревших функций работы со строками существуют мультибайтные аналоги. Например, функции strlen() соответствует функция mb_strlen() , для функции substr() есть мультибайтный аналог mb_substr() . Синтаксис почти идентичен, за тем лишь исключением, что вы можете (не обязательно) одним из аргументов указывать кодировку, с которой работаете. Пример:

    Вернёт корректный результат: 4. Внимание! Если явно не указать кодировку, будет использована серверная кодировка «по умолчанию». А она может отличаться от кодировки, в которой вы работаете над сайтом.

    Указывать кодировку явно не всегда удобно. Например, когда требуется взять часть строки с 5 символа до конца, удобней воспользоваться такой конструкцией:

    Здесь я не указал, сколько символов мне нужно, потому функция вернёт весь остаток строки. Но если нужно указать кодировку, код становится сложней:

    Тут уже надо явно задавать, сколько нужно символов в результате, чтобы следующим аргументом указать кодировку (нельзя один аргумент пропустить, а следующий указать). Чтобы избежать ещё большего усложнения кода (использования функции mb_strlen() для определения длины строки) я прибегнул к хитрости — добавил к строке произвольный символ ‘1’ и аргументом «-1» указал, что мне нужна вся строка с 5-го до последнего символа (1 с конца).

    Читайте также:  300 Cannot connect to smb server ps2

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

    Один раз указали «UTF-8» — и в дальнейшем в своих функциях кодировку можно не указывать, если в них вы планируете работать со строками, кодированными в «UTF-8». Функцию mb_internal_encoding() я обычно прописываю в файле конфигурации проекта. Т.е. в том файле, который гарантированно будет подключен в первую очередь, до обработки кодов различных скриптов моего проекта.

    Замечание

    В официальных источника сказано, что расширение mbstring не входит в список расширений, устанавливаемых по умолчанию. А вот расширение iconv по умолчанию включено. При написании скриптов для себя, вам достаточно просто проверить, включено ли на вашем хостинге mbstring (и можно даже включить, если выключено). Но, при написании скриптов в продакшн, один из ста клиентов создаст вам проблемы. Чтобы этого избежать, пользуйтесь аналогичными функциями расширения iconv:

    • iconv_strlen — Возвращает количество символов в строке
    • iconv_strpos — Возвращает позицию первого вхождения подстроки
    • iconv_strrpos — Возвращает позицию последнего вхождения подстроки
    • iconv_substr — Получение части строки
    • iconv — Преобразование строки в требуемую кодировку
    • и т.д.

    За подсказку выражаю благодарность x64 (aka andi).

    Ссылка на основную публикацию
    Adblock
    detector