GNU/Linux >> Znalost Linux >  >> Linux

UTF-8 celou cestu

Ú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žívat utf8mb4 kódování, pokud 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é má být u připojení použito – to je obvykle preferovaný přístup. V PHP:

    • Pokud používáte vrstvu abstrakce PDO s PHP ⥠5.3.6, můžete zadat charset 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 uvízli v obyčejném 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, který MySQL sdělí, jak vaše aplikace očekává kódování dat o připojení:SET NAMES 'utf8mb4' .

  • Totéž platí pro utf8mb4 /utf8 platí jako výše.

Výstup :

  • UTF-8 by mělo být nastaveno v záhlaví HTTP, například Content-Type: text/html; charset=utf-8 . Můžete toho dosáhnout buď nastavením default_charset v php.ini (preferováno) nebo ručně pomocí header() funkce.
  • Pokud vaše aplikace přenáší text do jiných systémů, budou také muset být informovány 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 HTTP odpovědí nebo metadat HTML).
  • Při kódování výstupu pomocí json_encode() , přidejte JSON_UNESCAPED_UNICODE jako druhý parametr.

Vstup :

  • Prohlížeče odesílají data ve znakové sadě určené pro dokument, takže na vstupu není třeba dělat nic konkrétního.
  • V případě, že máte pochybnosti o kódování požadavku (pro případ, že by s ním bylo možné manipulovat), můžete ověřit, že každý přijatý řetězec je platný UTF-8, než jej zkusíte uložit nebo kdekoli použít. PHP mb_check_encoding() 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.

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 mbstring PHP 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 ekvivalent 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, kde najdete dobré zdroje, kde se dozvíte vše, co potřebujete vědět.


Kromě nastavení default_charset v php.ini můžete odeslat správnou znakovou sadu pomocí header() z vašeho kódu před jakýmkoli výstupem:

header('Content-Type: text/html; charset=utf-8');

Práce s kódováním Unicode v PHP je snadná, pokud si uvědomíte, že většina funkcí řetězců nefunguje s kódováním Unicode a některé mohou řetězce zcela pozměnit . PHP považuje „znaky“ za 1 bajt dlouhé. Někdy je to v pořádku (například explode() hledá pouze bajtovou sekvenci a používá ji jako oddělovač -- takže nezáleží na tom, jaké skutečné znaky hledáte). Ale jindy, když je funkce skutečně navržena tak, aby fungovala na znakech , PHP netuší, že váš text obsahuje vícebajtové znaky, které lze nalézt pomocí Unicode.

Dobrá knihovna ke kontrole je phputf8. Tím se přepíší všechny "špatné" funkce, takže můžete bezpečně pracovat s řetězci UTF8. Existují rozšíření, jako je rozšíření mb_string, které se to také snaží udělat za vás, ale já preferuji používání knihovny, protože je přenosnější (ale píšu produkty pro masový trh, takže to je pro mě důležité). Ale phputf8 může použít mb_string za scénou ke zvýšení výkonu.


K vynikající odpovědi chazomatica bych rád dodal jednu věc:

Nezapomeňte ani na značku META (jako je tato, nebo na její HTML4 nebo XHTML verzi):

<meta charset="utf-8">

Zdá se to triviální, ale IE7 mi s tím dříve dělal problémy.

Dělal jsem všechno správně; databáze, připojení k databázi a hlavička HTTP Content-Type byly všechny nastaveny na UTF-8 a fungovalo to dobře ve všech ostatních prohlížečích, ale Internet Explorer stále trval na použití kódování „západní Evropa“.

Ukázalo se, že na stránce chybí značka META. Přidání, které problém vyřešilo.

Upravit:

W3C má ve skutečnosti poměrně velkou část věnovanou I18N. Mají řadu článků souvisejících s touto problematikou – popisující HTTP, (X)HTML a CSS stránku věcí:

  • Časté dotazy:Změna kódování stránky (X)HTML na UTF-8
  • Deklarování kódování znaků v HTML
  • Výukový program:Znakové sady a kódování v XHTML, HTML a CSS
  • Nastavení parametru znakové sady HTTP

Doporučují používat jak hlavičku HTTP, tak metaznačku HTML (nebo deklaraci XML v případě, že XHTML slouží jako XML).


Linux
  1. Zobrazit všechny soubory až do shody?

  2. Nejrychlejší způsob, jak extrahovat Iso?

  3. Linux – Existuje nějaký způsob, jak zjistit rychlost vaší paměti pomocí softwaru?

  1. Jaký je nejlepší způsob nastavení proměnných prostředí podle distro/shell agnostického prostředí?

  2. Jaký je nejrychlejší způsob odstranění všech souborů a podsložek v adresáři?

  3. Jaký je nejlepší způsob, jak nastavit proměnnou prostředí v .bashrc?

  1. Nejlepší způsob, jak zrušit všechny úlohy Slurm z výstupu příkazů Shell?

  2. Jak nastavit časové pásmo pro PHP přes cPanel

  3. Jak nastavit verzi PHP pro doménu pomocí cPanel?