Я считаю, что это во многом культурная, а не техническая проблема.
что касается технических проблем --- и не совсем просто реализовать юникод в экосистеме, основанной на предположении, что «один символ равен одному байту» - разработчики могли бы скопировать большую часть усилий Java или Python (последний с достойной и в значительной степени работающей совместимостью с юникодом примерно с 2001 года), но они так и не сделали.
когда я читаю ветку обсуждения, прилагаемую к официальной, текущей документации по utf8_encode()
функции php , я чувствую головокружение.
во-первых, эта функция называется utf8_encode()
; однако, в документации говорится, что ожидаемая строка должна быть в ISO-8859-1 (a.k.a. latin-1). это ооочень php, это ооочень 80-х годов.
большинство комментаторов, похоже, воспринимают юникод как бремя. Есть много предложений о том, как преобразовать строки «неизвестного содержимого», как обращаться с s «строками со смешанным кодированием» (wtf?) или работать с кодовыми точками, которые обычно вызывают сбой, потому что они выходят за рамки четырехбайтной функции. предел кодовой точки.
обсуждение сосредоточено вокруг исправлений, чтобы избавиться от закорючек или избежать проблемных частей поведения этой функции. и это, для меня, sooo php: все просто делают исправления, мало что реализовано в корне правильно. если вы считаете, что это клевета на мою сторону, вот некоторые лакомые кусочки:
Хотя это, кажется, нарушает немецкий Umlaute [äöü], если документ уже UTF-8.
(непонимание того, что utf-8 не предназначен для работы при двойном применении)
Посмотрите на функцию iconv (), которая предлагает способ конвертации из 8859 и страшных 1252 в UTF8
(хороший момент: пренебрежение предшествующим уровнем техники со стороны разработчиков php; вместо этого глючит собственная реализация)
использование preg_match для определения необходимости использования utf8_encode [...], исключая суррогаты [...], исключая переопределения
(предлагает молча стереть весь проблемный контент из строк, оставляя только те вещи, которые не ломаются utf8_encode()
; это может сделать текст нечитаемым (или вообще исчезнуть), но, эй, больше сообщений об ошибках)
для кодирования строки, только если это еще не UTF-8 [...] mb_detect_encoding($s, "UTF-8")
(как указано другим комментатором , это не сработает:
$str = 'áéóú'; // ISO-8859-1
mb_detect_encoding($str, 'UTF-8'); // 'UTF-8'
mb_detect_encoding($str, 'UTF-8', true); // false
поэтому здесь мы смотрим на одну ошибку, заменяемую другой. хорошей охоты. кроме того, они, похоже, предлагают здесь решить проблему с помощью эвристических (медленных, неопределенных) средств, которые можно и нужно решать механическими (быстрыми, определенными) средствами)
utf8_ [кодировать | декодировать] фактически будет также переводить символы windows-1252, а не только из / в ISO-8859-1, как сказано в документации
(вы никогда не можете полагаться на официальную документацию php, чтобы быть ясной или исчерпывающей - вы всегда должны прочитать многолетний опыт пользователей, который никто никогда не обратит на документацию)
Я работал над функцией is_utf8 и хотел опубликовать ее здесь, в дополнение к другим, я также учел ошибку в 5000 символов
(исправление для проблемы, которая в основном существует только потому, что юникод не реализован должным образом. Мы также узнаем, что функция utf8_encode()
не только откажется за пределы 4 байтов на кодовую точку, она также сломается, если полученная ?) текст превышает ограничение в 5000 символов)
Я мог бы продолжать и продолжать в том же духе. у вас уже есть идея: судя по этой теме, сообщество php просто не похоже, что они где-то готовы понять, что такое кодировки и наборы символов, что нужно для создания звуковой инфраструктуры в целом или, в частности, для реализовать Юникод надлежащим образом. вместо этого они используют свои строительные леса, картон, гвозди и молотки и продолжают строить это грандиозное здание, называемое php, бросая клейкую ленту на все проблемы, которые невозможно устранить другим гвоздем. Конечно, это здание будет страдать от каждого дующего ветра, такого как случайный юридический, но неожиданный характер.
наблюдение за тем, как эта конкретная нить активна в течение восьми лет, не вселяет уверенности, что через восемь лет ситуация будет лучше.