Vzpostavljam nov strežnik in v svoji spletni aplikaciji želim v celoti podpirati UTF-8. V preteklosti sem to že poskušal na obstoječih strežnikih in vedno se mi je zdelo, da se moram vrniti na ISO-8859-1.
Kje točno moram nastaviti kodiranje/skupine znakov? Zavedam se, da moram za to konfigurirati Apache, MySQL in PHP - ali obstaja kakšen standardni kontrolni seznam, ki ga lahko upoštevam, ali pa morda poiščem, kje prihaja do neskladij?
Gre za nov strežnik Linux, v katerem tečejo MySQL 5, PHP 5 in Apache 2.
Hramba podatkov:
utf8mb4
za vse tabele in besedilne stolpce v svoji zbirki podatkov. Tako bo MySQL fizično shranil in priklical vrednosti, ki so izvirno kodirane v UTF-8. Upoštevajte, da bo MySQL implicitno uporabil kodiranje utf8mb4
, če je določena kolatacija utf8mb4_*
(brez izrecnega nabora znakov).utf8
, ki podpira le podmnožico znakov Unicode. Želim si, da bi se šalil.
Dostop do podatkov:utf8mb4
. Na ta način MySQL pri posredovanju podatkov vaši aplikaciji ne bo opravil pretvorbe iz izvirnega UTF-8 in obratno.charset
:
$dbh = new PDO('mysql:charset=utf8mb4');set_charset()
:
$mysqli->set_charset('utf8mb4'); // objektno usmerjen slog
mysqli_set_charset($link, 'utf8mb4'); // proceduralni slogmysql_set_charset
.SET NAMES 'utf8mb4'
]](http://dev.mysql.com/doc/en/charset-connection.html).utf8mb4
/utf8
velja enako kot zgoraj.
Izhod:default_charset
php.ini ali sami ročno določite glavo MIME Content-Type
, kar je sicer več dela, vendar ima enak učinek.json_encode()
dodajte JSON_UNESCAPED_UNICODE
kot drugi parameter.
Vhod:mb_check_encoding()
opravi to nalogo, vendar ga je treba versko uporabljati. Tega res ni mogoče zaobiti, saj lahko zlonamerni odjemalci pošljejo podatke v kodiranju, kakršno želijo, in nisem našel trika, s katerim bi PHP to zanesljivo storil namesto vas.accept-charset
vsem oznakam <form>
: <form ... accept-charset="UTF-8">
.<form>
.
Drugi vidiki kode:mbstring
.mbstring
.Poleg nastavitve default_charset
v php.ini lahko pravilen znakovni niz pošljete z uporabo header()
znotraj svoje kode, in sicer pred kakršnim koli izpisom:
header('Content-Type: text/html; charset=utf-8');
Delo z Unicode v PHP je enostavno, če se zavedate, da večina strunskih funkcij ne deluje z Unicode, nekatere pa lahko popolnoma spremenijo nize. PHP meni, da so "znaki" dolgi 1 bajt. Včasih je to v redu (na primer funkcija explode()
išče samo zaporedje bajtov in ga uporabi kot ločilo - zato ni pomembno, katere dejanske znake iščete). V drugih primerih, ko je funkcija dejansko zasnovana za delovanje na znakih, pa PHP nima pojma, da ima vaše besedilo večbajtne znake, ki jih najdemo v Unicode.
Dobra knjižnica za preverjanje je phputf8. Ta prepiše vse "slabe" funkcije, tako da lahko varno delate z nizi UTF8. Obstajajo tudi razširitve, kot je razširitev mbstring, ki poskušajo to storiti namesto vas, vendar raje uporabljam knjižnico, ker je bolj prenosljiva (vendar pišem izdelke za množični trg, zato je to zame pomembno). Toda phputf8 lahko v ozadju vseeno uporablja mbstring, da poveča zmogljivost.
V PHP morate uporabiti multibyte functions ali vklopiti mbstring.func_overload. Tako bodo stvari, kot je strlen, delovale, če imate znake, ki zasedajo več kot en bajt.
Prav tako boste morali določiti nabor znakov vaših odgovorov. Uporabite lahko AddDefaultCharset, kot je navedeno zgoraj, ali pa napišete kodo PHP, ki vrne glavo. (Lahko pa v dokumente HTML dodate oznako META.)