Обеспечение допустимого UTF-8 в PHP

В течение некоторого времени мы использовали DocBook, но было очень трудно расшириться с более усовершенствованными, и необходимыми функциями (подсветка синтаксиса, разделяющая на несколько файлов, управление многоязычием и т.д.). Позже, мы решили записать нашу собственную систему с нуля и выпустить ее как открытый исходный код: текст ссылки . Это использует файлы простого текста и Скидку с цены как язык синтаксиса, и теперь у нас есть все, в чем мы нуждаемся. Недостаток - то, что в настоящее время нет, вероятно, никакого синтаксического анализатора Скидки с цены, который производит что-то еще, чем вывод HTML. На данный момент это достаточно, но мы думаем о реализации поддержки PDF довольно скоро.

, Кроме того, мы - maintaing MediaWiki как основанная на сообществе справка.

20
задан Peter Mortensen 8 July 2019 в 12:53
поделиться

2 ответа

UTF-8 может хранить любой символ Юникода. Если ваша кодировка вообще какая-то другая, включая ISO-8859-1 или Windows-1252, UTF-8 может хранить в ней каждый символ. Поэтому вам не нужно беспокоиться о потере каких-либо символов при преобразовании строки из любой другой кодировки в UTF-8.

Кроме того, как ISO-8859-1, так и Windows-1252 являются однобайтовыми кодировками, где любой байт действительный. Различить их технически невозможно. Я бы выбрал Windows-1252 в качестве соответствия по умолчанию для последовательностей, отличных от UTF-8, поскольку единственные байты, которые декодируются по-разному, - это диапазон 0x80-0x9F. Они декодируют различные символы, такие как умные кавычки и евро в Windows-1252, тогда как в ISO-8859-1 они являются невидимыми управляющими символами, которые почти никогда не используются. Веб-браузеры иногда могут сказать, что они используют ISO-8859-1, но часто они действительно будут использовать Windows-1252.

будет ли этот код гарантировать, что строка безопасна для вставки в документ в кодировке UTF-8

Вы наверняка захотел бы для этой цели установить для необязательного параметра "strict" значение TRUE. Но я не уверен, что это действительно касается всех недопустимых последовательностей UTF-8. Функция не претендует на явную проверку последовательности байтов на соответствие UTF-8. Были известны случаи, когда mb_detect_encoding раньше неправильно угадывал UTF-8, хотя я не знаю, может ли это все еще происходить в строгом режиме.

Если вы хотите быть уверенным, сделайте это самостоятельно, используя W3- рекомендуемое регулярное выражение :

if (preg_match('%^(?:
      [\x09\x0A\x0D\x20-\x7E]            # ASCII
    | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
    | \xE0[\xA0-\xBF][\x80-\xBF]         # excluding overlongs
    | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
    | \xED[\x80-\x9F][\x80-\xBF]         # excluding surrogates
    | \xF0[\x90-\xBF][\x80-\xBF]{2}      # planes 1-3
    | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
    | \xF4[\x80-\x8F][\x80-\xBF]{2}      # plane 16
)*$%xs', $string))
    return $string;
else
    return iconv('CP1252', 'UTF-8', $string);
37
ответ дан 29 November 2019 в 23:04
поделиться

Have a look at http://www.phpwact.org/php/i18n/charsets for a guide about character sets. This page links to a page specifically for UTF-8.

1
ответ дан 29 November 2019 в 23:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: