Úložiště dat :
-
Zadejte
utf8mb4
znakovou sadu ve všech tabulkách a textových sloupcích v databázi. Díky tomu MySQL fyzicky ukládá a získává hodnoty zakódované nativně v UTF-8. Všimněte si, že MySQL bude implicitně používatutf8mb4
kódování v případěutf8mb4_*
je specifikováno řazení (bez explicitní znakové sady). -
Ve starších verzích MySQL (<5.5.3) budete bohužel nuceni používat jednoduše
utf8
, který podporuje pouze podmnožinu znaků Unicode. Kéž bych si dělal srandu.
Přístup k datům :
-
V kódu vaší aplikace (např. PHP), v jakékoli metodě přístupu k databázi, kterou používáte, musíte nastavit znakovou sadu připojení na
utf8mb4
. Tímto způsobem MySQL neprovádí žádnou konverzi ze svého nativního UTF-8, když předává data vaší aplikaci a naopak. -
Některé ovladače poskytují svůj vlastní mechanismus pro konfiguraci znakové sady připojení, která aktualizuje svůj vlastní vnitřní stav a informuje MySQL o kódování, které se má při připojení použít – to je obvykle preferovaný přístup. V PHP:
-
Pokud používáte CHOP abstraktní vrstva s PHP ≥ 5.3.6, můžete zadat
znakovou sadu
v DSN :$dbh = new PDO('mysql:charset=utf8mb4');
-
Pokud používáte mysqli , můžete zavolat
set_charset()
:$mysqli->set_charset('utf8mb4'); // object oriented style mysqli_set_charset($link, 'utf8mb4'); // procedural style
-
Pokud jste zůstali u prostého mysql ale náhodou používáte PHP ≥ 5.2.3, můžete zavolat
mysql_set_charset
.
-
-
Pokud ovladač neposkytuje svůj vlastní mechanismus pro nastavení znakové sady připojení, možná budete muset zadat dotaz, abyste MySQL sdělili, jak vaše aplikace očekává kódování dat o připojení:
NASTAVENÍ NÁZVŮ 'utf8mb4'
. -
Totéž platí pro
utf8mb4
/utf8
platí jako výše.
Výstup :
-
Pokud vaše aplikace přenáší text do jiných systémů, budou také muset být informováni o kódování znaků. U webových aplikací musí být prohlížeč informován o kódování, ve kterém jsou data odesílána (prostřednictvím hlaviček odpovědí HTTP nebo metadat HTML ).
-
V PHP můžete použít
default_charset
php.ini nebo ručně zadejteContent-Type
MIME záhlaví sami, což je jen více práce, ale má stejný účinek. -
Při kódování výstupu pomocí
json_encode()
, přidejteJSON_UNESCAPED_UNICODE
jako druhý parametr.
Vstup :
-
Bohužel byste měli ověřit každý přijatý řetězec jako platný UTF-8, než jej zkusíte uložit nebo kdekoli použít.
mb_check_encoding()
PHP dělá ten trik, ale musíte to používat nábožensky. Opravdu to nejde obejít, protože klienti se zlými úmysly mohou odesílat data v jakémkoli kódování, které chtějí, a nenašel jsem trik, jak přimět PHP, aby to za vás spolehlivě udělalo. -
Z mého čtení aktuální specifikace HTML , následující dílčí odrážky již nejsou pro moderní HTML nutné nebo dokonce platné. Chápu to tak, že prohlížeče budou pracovat a odesílat data ve znakové sadě určené pro dokument. Pokud však cílíte na starší verze HTML (XHTML, HTML4 atd.), mohou být tyto body stále užitečné:
- Pouze pro HTML před HTML5 :chcete, aby všechna data, která vám odesílají prohlížeče, byla v UTF-8. Bohužel, pokud to uděláte jediným způsobem, jak to spolehlivě udělat, je přidat
accept-charset
atribut ke všem vašimtagy:
.
- Pouze pro HTML před HTML5 :všimněte si, že specifikace HTML W3C říká, že klienti „by měli“ standardně odesílat formuláře zpět na server v jakékoli znakové sadě, kterou server obsluhoval, ale toto je zjevně pouze doporučení, a proto je potřeba být explicitní v každém
tag.
- Pouze pro HTML před HTML5 :chcete, aby všechna data, která vám odesílají prohlížeče, byla v UTF-8. Bohužel, pokud to uděláte jediným způsobem, jak to spolehlivě udělat, je přidat
Další aspekty kódu :
-
Je zřejmé, že všechny soubory, které budete poskytovat (PHP, HTML, JavaScript atd.), by měly být kódovány v platném UTF-8.
-
Musíte se ujistit, že pokaždé, když zpracováváte řetězec UTF-8, děláte to bezpečně. To je bohužel ta nejtěžší část. Pravděpodobně budete chtít široce využívat PHP
mbstring
rozšíření. -
Vestavěné operace s řetězci v PHP nejsou ve výchozím nastavení bezpečné UTF-8. Existují některé věci, které můžete bezpečně dělat s běžnými operacemi s řetězci PHP (jako je zřetězení), ale pro většinu věcí byste měli použít ekvivalentní
mbstring
funkce. -
Abyste věděli, co děláte (čtěte:nepokazit to), musíte opravdu znát UTF-8 a jak funguje na nejnižší možné úrovni. Podívejte se na některý z odkazů z utf8.com nějaké dobré zdroje, kde se dozvíte vše, co potřebujete vědět.