hoi
@hoi
Быдлокодер

Как определить кодировку windows-1251 регулярным выражением?

Здравствуйте, совсем недавно мне нужно было обнаружить в переменной неверную кодировку и перевести её в UTF-8.

Нашел в интернете вот такой код:
if (!preg_match('/^.{1}/us', $data)) {
     $data = iconv("windows-1251", "utf-8", $data); 
}


Вопрос следующий: как функция preg_match выполняет проверку и что может пойти не так с данным примером (если может вообще)?
  • Вопрос задан
  • 186 просмотров
Решения вопроса 1
rabbit418
@rabbit418
23 yo Designer from Ukraine
Начиная с PHP 4 есть функция mb_check_encoding которая проверяет строку на соответствие заданной кодировке.

<?php
if (mb_check_encoding($data, 'windows-1251')) {
    $data = iconv("windows-1251", "utf-8", $data);
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
lidacriss
@lidacriss
wtf
тут важен модификатор "u" в регулярном выражении
u (PCRE_UTF8)
Этот модификатор включает дополнительную функциональность PCRE, которая не совместима с Perl: шаблон и целевая строка обрабатываются как UTF-8 строки. Недопустимая целевая строка приводит к тому, что функции preg_* ничего не находят, а неправильный шаблон приводит к ошибке уровня E_WARNING.
Ответ написан
Очень часто перед тем как чтолибо придумывать, нужно убедиться не является ли это уже частью языка. Много вопросов задают на собеседованиях, как выполнить ту, или иную задачу, джун пытается придумать какойто код, но зачастую оказывается что это реализовано уже, и вшито в язык.
Ответ написан
vesper-bot
@vesper-bot
Любитель файрволлов
Судя по вот этому lawrence.ecorp.net/inet/samples/regexp-intro.php флаги значат "включить поддержку unicode" и "рассматривать вход как одну строку". Таким образом, выражение проверяет, является ли первый символ $data валидным символом Unicode, и если нет, код под условием выполняет преобразование в юникод из windows-1251. Для однобайтной кириллической кодировки её символы находятся в диапазоне 0xC0-0xFF, если в $data кириллица, то в этом случае преобразование двух подряд байт в юникод провалится, так как в UTF8 после 0xC0-0xF4 должны идти байты из 0x80-0xBF, что достаточно часто является верным. "Пойти некорректно" может, если текст начинается на большую букву, а вторым символом идет "ё", в этом случае преобразование первого символа в юникод будет успешным. В случае, если входящий поток пришел в KOI-8, ошибка распознавания кодировки обеспечена, другое дело, что мало какой клиент сейчас отдает текст в веб-запрос в KOI-8. Так что осторожнее с такой наивной проверкой.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы