Datalagring :
-
Angiv
utf8mb4
tegnsæt på alle tabeller og tekstkolonner i din database. Dette får MySQL til fysisk at gemme og hente værdier indkodet i UTF-8. Bemærk, at MySQL implicit vil brugeutf8mb4
kodning hvis enutf8mb4_*
sortering er angivet (uden noget eksplicit tegnsæt). -
I ældre versioner af MySQL (<5.5.3) bliver du desværre tvunget til blot at bruge
utf8
, som kun understøtter et undersæt af Unicode-tegn. Jeg ville ønske, jeg lavede sjov.
Dataadgang :
-
I din applikationskode (f.eks. PHP), uanset hvilken DB-adgangsmetode du bruger, skal du indstille forbindelsestegnsættet til
utf8mb4
. På denne måde foretager MySQL ingen konvertering fra sin oprindelige UTF-8, når den videregiver data til din applikation og omvendt. -
Nogle drivere giver deres egen mekanisme til at konfigurere forbindelsestegnsættet, som både opdaterer sin egen interne tilstand og informerer MySQL om den kodning, der skal bruges på forbindelsen - dette er normalt den foretrukne tilgang. I PHP:
-
Hvis du bruger PDO abstraktionslag med PHP ≥ 5.3.6, du kan angive
charset
i DSN :$dbh = new PDO('mysql:charset=utf8mb4');
-
Hvis du bruger mysqli , kan du ringe til
set_charset()
:$mysqli->set_charset('utf8mb4'); // object oriented style mysqli_set_charset($link, 'utf8mb4'); // procedural style
-
Hvis du sidder fast med almindelig mysql men tilfældigvis kører PHP ≥ 5.2.3, kan du ringe til >
mysql_set_charset
.
-
-
Hvis driveren ikke har sin egen mekanisme til indstilling af forbindelsestegnsættet, skal du muligvis udsende en forespørgsel for at fortælle MySQL, hvordan din applikation forventer, at data på forbindelsen bliver kodet:
SÆT NAVNE 'utf8mb4'
. -
Samme overvejelse vedrørende
utf8mb4
/utf8
gælder som ovenfor.
Output :
-
Hvis din applikation sender tekst til andre systemer, skal de også informeres om tegnkodningen. Med webapplikationer skal browseren informeres om den kodning, som data sendes i (via HTTP-svarheaders eller HTML-metadata ).
-
I PHP kan du bruge
default_charset
php.ini mulighed, eller udsted manueltContent-Type
MIME header dig selv, hvilket bare er mere arbejde, men har samme effekt. -
Ved indkodning af output ved hjælp af
json_encode()
, tilføjJSON_UNESCAPED_UNICODE
som en anden parameter.
Input :
-
Desværre bør du bekræfte hver modtaget streng som værende gyldig UTF-8, før du forsøger at gemme den eller bruge den hvor som helst. PHP's
mb_check_encoding()
gør tricket, men du skal bruge det religiøst. Der er virkelig ingen vej udenom dette, da ondsindede klienter kan indsende data i hvilken som helst kodning, de ønsker, og jeg har ikke fundet et trick til at få PHP til at gøre dette for dig pålideligt. -
Fra min læsning af den nuværende HTML-specifikation , er de følgende underpunkter ikke længere nødvendige eller endda gyldige for moderne HTML. Min forståelse er, at browsere vil arbejde med og indsende data i det tegnsæt, der er specificeret for dokumentet. Men hvis du målretter mod ældre versioner af HTML (XHTML, HTML4 osv.), kan disse punkter stadig være nyttige:
- Kun til HTML før HTML5 :du ønsker, at alle data sendt til dig af browsere skal være i UTF-8. Desværre, hvis du går efter, er den eneste måde at gøre dette på pålideligt at tilføje
accept-charset
attribut til alle dinetags:
.
- Kun til HTML før HTML5 :bemærk, at W3C HTML-specifikationen siger, at klienter "skal" som standard sende formularer tilbage til serveren i det tegnsæt, serveren serverede, men dette er tilsyneladende kun en anbefaling, derfor behovet for at være eksplicit på hver enkelt
- Kun til HTML før HTML5 :du ønsker, at alle data sendt til dig af browsere skal være i UTF-8. Desværre, hvis du går efter, er den eneste måde at gøre dette på pålideligt at tilføje
Andre kodeovervejelser :
-
Det er klart nok, at alle filer, du vil betjene (PHP, HTML, JavaScript osv.), skal være kodet i gyldig UTF-8.
-
Du skal sørge for, at hver gang du behandler en UTF-8-streng, gør du det sikkert. Dette er desværre den svære del. Du vil sikkert gerne gøre udstrakt brug af PHP's
mbstring
udvidelse. -
PHP's indbyggede strengoperationer er ikke som standard UTF-8 sikker. Der er nogle ting, du sikkert kan gøre med normale PHP-strengoperationer (såsom sammenkædning), men til de fleste ting bør du bruge den tilsvarende
mbstring
funktion. -
For at vide, hvad du laver (læs:ikke ødelægge det), skal du virkelig kende UTF-8, og hvordan det virker på det lavest mulige niveau. Tjek et af linkene fra utf8.com for nogle gode ressourcer til at lære alt, hvad du behøver at vide.