PHP: простой способ определения кодировки UTF-8
Придумал простой способ определения кодировки UTF-8 в PHP, работает без модулей iconv и multibyte string (mb-функции):
if (preg_match('//u', $string)) { /* у вас UTF-8 */ }
Работать должно, думаю, с версии PHP 4.3.5, в документации сказано: «UTF-8 validity of the pattern is checked since PHP 4.3.5».
Нужно отметить, что строка, содержащая только ASCII-символы тоже принимается за юникодную.
Комментарий для morozov.livejournal.com:
Не «ASCII», а «нижняя половина ASCII». Это тоже UTF-8.
Там бы ещё модификатор s, но тогда теоретически возможно оптимизационное «выполнение» таких регулярок «не глядя на строку», что теоретически может испортить всю идею.
Комментарий для bressergey.com:
а он там не важен — сначала идёт проверка на валидность строки (из доки по PCRE): «When you set the PCRE_UTF8 flag, the strings passed as patterns and subjects are (by default) checked for validity on entry to the relevant functions».
Комментарий для Евгения Степанищева:
Голосую за morozovа, по-моему верхняя половина — уже и на ASCII вовсе.
ASCII, is a character encoding based on the English alphabet... ASCII includes definitions for 128 characters... (wiki)
Комментарий для zencd.livejournal.com:
Как это не называй, а всё одно — символы с кодами 0-127 входят в UTF-8.
Странно, что до сих пор никто не пришёл и не сказал, что символ с кодом ноль в UTF-8 не входит.
Так ведь символ с кодом ноль в UTF-8 не входит!
А я вот такое видел:
preg_match(’/^.$/u’, ’ñ’)
Тьфу, это проверка наличия поддержки UTF-8... Шото я затупил :)
Комментарий для coprophagous.ru:
О! Дима проснулся :) У тебя дома интернет что ли есть?
Комментарий для coprophagous.ru:
А мы тут твой проект украли!
Спасибо большое за идею — работает :)
Спасибо, простое и быстрое решение :)
Комментарий для Евгения Степанищева:
Спасибо. Попробовал.
Интересно, что мне в решении не помогло.
Хотя, у меня проверка кодировки была лишь возможным методом определения проблемы...
Комментарий для skobkin-ru.ya.ru:
Если вы используете определение кодировки на латинских буквах и/или цифрах, то оно и не поможет, такой текст находится и в кодировке UTF-8, и в, скажем, CP866, CP1251, CP1252 и ещё в целой куче других.
Если «такой текст находится и в кодировке UTF-8, и в, скажем, CP866, CP1251, CP1252 и ещё в целой куче других»
выкиньте все эти стандарты на мусорник. Исторически сложилась ситуация, что никчемные стандарты типа HTML занимают доминирующее положение. В России надо от них отказаться, так же как сделали с шириной рельсовой колеи.
Забыл адрес
Комментарий для andyb:
Вы, кажется, ответили вне контекста.
Спасибо большое, спасли меня)
Гениально!