Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

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».

21 комментарий
morozov.livejournal.com 2008

Нужно отметить, что строка, содержащая только ASCII-символы тоже принимается за юникодную.

Евгений Степанищев (bolknote.ru) 2008

Комментарий для morozov.livejournal.com:

Не «ASCII», а «нижняя половина ASCII». Это тоже UTF-8.

tserbis (BresSergey.com) 2008

Там бы ещё модификатор s, но тогда теоретически возможно оптимизационное «выполнение» таких регулярок «не глядя на строку», что теоретически может испортить всю идею.

Евгений Степанищев (bolknote.ru) 2008

Комментарий для 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».

zencd.livejournal.com 2008

Комментарий для Евгения Степанищева:

Голосую за morozovа, по-моему верхняя половина — уже и на ASCII вовсе.

ASCII, is a character encoding based on the English alphabet... ASCII includes definitions for 128 characters... (wiki)

Евгений Степанищев (bolknote.ru) 2008

Комментарий для zencd.livejournal.com:

Как это не называй, а всё одно — символы с кодами 0-127 входят в UTF-8.

Евгений Степанищев (bolknote.ru) 2008

Странно, что до сих пор никто не пришёл и не сказал, что символ с кодом ноль в UTF-8 не входит.

acerbial (coprophagous.ru) 2008

Так ведь символ с кодом ноль в UTF-8 не входит!

FX Poster (blog.fxposter.org) 2008

А я вот такое видел:
preg_match(’/^.$/u’, ’ñ’)

FX Poster (blog.fxposter.org) 2008

Тьфу, это проверка наличия поддержки UTF-8... Шото я затупил :)

Евгений Степанищев (bolknote.ru) 2008

Комментарий для coprophagous.ru:

О! Дима проснулся :) У тебя дома интернет что ли есть?

Евгений Степанищев (bolknote.ru) 2008

Комментарий для coprophagous.ru:

А мы тут твой проект украли!

svdev.livejournal.com 2008

Спасибо большое за идею — работает :)

Ufawebmaster.ya.ru 2009

Спасибо, простое и быстрое решение :)

Skobkin.ru (skobkin-ru.ya.ru) 2010

Комментарий для Евгения Степанищева:

Спасибо. Попробовал.
Интересно, что мне в решении не помогло.
Хотя, у меня проверка кодировки была лишь возможным методом определения проблемы...

Евгений Степанищев (bolknote.ru) 2010

Комментарий для skobkin-ru.ya.ru:

Если вы используете определение кодировки на латинских буквах и/или цифрах, то оно и не поможет, такой текст находится и в кодировке UTF-8, и в, скажем, CP866, CP1251, CP1252 и ещё в целой куче других.

andyb 2012

Если «такой текст находится и в кодировке UTF-8, и в, скажем, CP866, CP1251, CP1252 и ещё в целой куче других»
выкиньте все эти стандарты на мусорник. Исторически сложилась ситуация, что никчемные стандарты типа HTML занимают доминирующее положение. В России надо от них отказаться, так же как сделали с шириной рельсовой колеи.

andyb@meta.ua 2012

Забыл адрес

Евгений Степанищев (bolknote.ru) 2012

Комментарий для andyb:

Вы, кажется, ответили вне контекста.

Панда Анонимус 2015

Спасибо большое, спасли меня)

Конфиденциально 2023

Гениально!