Autor Zpráva
llook
Profil
Jak zjistit, jestli řetězec je validní UTF-8? Pokud bych se mohl spolehnout na mb funkce, pak snad mb_detect_encoding. Jenže na mb funkce spoléhat nemůžu. Napadá mě akorát kontrolovat to byte po bytu. Má někdo lepší nápad?

Přemýšlím nad tím v souvislosti s wiki-systémem - jednou z vlastností wiki je, že napíšete do adresového řádku název stránky a případně ji vytvoříte. Jenže Firefox to chybně kóduje do iso-8859-1 a to by nedělalo dobře.
Charlie
Profil
Co se týče UTF-8, tak mě nenapadá nic lepšího, než to kontrolovat po bytech.

Problém s Firefoxem byste ale mohl vyřešit za pomoci nějakých fíglů. Mohl byste vyjít z toho, že hodně funkcí v PHP pro práci s řetězci umí pouze ISO-8859. Když byste použil tyto funkce na řetězec v UTF, buď vám to vrátí false, nebo to vypíše chybu. Pokud by to vypisovalo chybu, tak by se toho dalo jednoduše využít pomocí exceptions (vyjímek). To ale jen za předpokladu, kdybyste měl k dispozici PHP 5.
llook
Profil
Tak jsem si na to napsal regulární výraz. Proč mě to sakra nenapadlo dřív?

$pattern = '/^('
.'[\0-\x7f]'
.'|[\xc0-\xdf][\x80-\xbf]'
.'|[\xe0-\xef][\x80-\xbf]{2}'
.'|[\xf0-\xf7][\x80-\xbf]{3}'
.'|[\xf8-\xfb][\x80-\xbf]{4}'
.'|[\xfc-\xfd][\x80-\xbf]{5}'
.')*$/m';

A teď jsem zjistil, že pokud použiju PCRE modifikátor u, tak dostanu nepravdu za každý invalidní UTF-8, takže výše uvedený regulár je zbytečný:

$invalida = "\xf1\x8f";
echo(preg_match('//u', $invalida)); // vypíše 0
Toto téma je uzamčeno. Odpověď nelze zaslat.