/ / Používanie sady znakov utf-8 s PHP - sú vyžadované funkcie mb? - php, utf-8, viacbajtové funkcie

Použitie utf-8 charset s PHP - vyžadujú sa funkcie mb? - php, utf-8, multibyte-functions

Posledných pár dní som pracovalprevádzam svoju základňu kódu PHP z latin1 na utf-8. Čítal som dve hlavné riešenia, ktorými sú buď nahradenie jednobajtových funkcií vstavanými viacbajtovými funkciami, alebo nastavenie hodnoty mbstring.func_overload v súbore php.ini.

Ale potom som sa stretol toto vlákno na pretečení zásobníka, kde príspevok oZdá sa, že thomasrutter naznačuje, že viacbajtové funkcie nie sú pre utf-8 skutočne potrebné, pokiaľ sú skriptové a reťazcové literály kódované v utf-8.

Nenašiel som žiadne ďalšie dôkazy, či totoje pravda alebo nie, a ak sa ukáže, že nemusím konvertovať svoj kód na mb_functions, potom by to bol šetrič v reálnom čase! Každý, kto to vrhne na to trochu svetla?

odpovede:

10 pre odpoveď č. 1

Pokiaľ dobre chápem problematiku, tak pokiaľ všetkyvaše dáta sú 100% v utf-8 - a to znamená vstup používateľa, databázu a tiež kódovanie samotných súborov PHP, ak v nich máte špeciálne znaky - to je pravdivý platí pre operácie vyhľadávania a porovnávania. Ako zdôrazňuje @ntd, non-multibyte strlen () bude produkovať nesprávne výsledky, keď bude spustený na reťazci, ktorý obsahuje viacbytové znaky.

TOTO je skvelý článok o základoch kódovania.


4 pre odpoveď č. 2

Nie sú potrebné, pokiaľ nepoužívate nič z funkcie, ktoré nahrádzajú (a je pravdepodobné, že vy s použitím aspoň jedného z nich) alebo inak výslovne potrebujú funkciu rozšírenia, ako napr Spracovanie HTTP.

Pri práci na dosiahnutí súladu s utf-8 sa vždy vrátim k Cheatheet PHP utf-8 s jedným dodatkom: Vzory PCRE je potrebné aktualizovať, aby sa dalo používať u modifikátor.


3 pre odpoveď № 3

Hneď ako preskúmate alebo upravíte viacbajtový reťazec, musíte použiť funkciu mb_ *. Veľmi rýchly príklad, ktorý ukazuje, prečo:

$str = "abcžđščćöçefg";
mb_internal_encoding("utf-8");

echo "strlen: ".strlen($str)."n";
echo "mb_strlen: ".mb_strlen($str)."n";

Vytlačí sa to:

strlen: 20
mb_strlen: 13

2 pre odpoveď № 4

thomasrutter naznačuje, že Vyhľadávanie nepotrebuje špeciálne zaobchádzanie. Napríklad, ak potrebujete skontrolovať dĺžku reťazca UTF8, nevidím, ako to môžete urobiť pomocou obyčajného kódu strlen().


2 pre odpoveď № 5

Tiež môžu byť potrebné funkcie ako mb_strtoupper. strtoupper neprevedie á na Á.


1 pre odpoveď č. 6

Existuje množstvo funkcií, ktoré sa dajú očakávaťreťazce musia byť jednobajtové (A niektorí dokonca predpokladajú, že je to iso-8859-1). V týchto prípadoch si musíte byť vedomí toho, čo robíte, a prípadne použiť náhradné funkcie. Na stránke: http://www.phpwact.org/php/i18n/utf-8


0 pre odpoveď č. 7

Môžete použiť knižnicu mbfunctions, ktorá rozširuje viacbajtové funkcie v PHP:

http://code.google.com/p/mbfunctions/


0 pre odpoveď č. 8

Môžete to použiť http://php.net/manual/en/mbstring.overload.php nastavenie v súbore php.ini, takže nemusíte meniť svoj kód.

Ale buďte opatrní, pretože nie všetky funkcie reťazcov sa zmenia automaticky. Toto je jeden: http://php.net/manual/en/function.substr-replace.php