Gegevensopslag :
-
Specificeer de
utf8mb4
tekenset op alle tabellen en tekstkolommen in uw database. Dit zorgt ervoor dat MySQL waarden fysiek opslaat en ophaalt die native zijn gecodeerd in UTF-8. Merk op dat MySQL impliciet gebruik zal maken vanutf8mb4
codering als eenutf8mb4_*
sortering is gespecificeerd (zonder enige expliciete tekenset). -
In oudere versies van MySQL (<5.5.3) zult u helaas genoodzaakt zijn om gewoon
utf8
te gebruiken , die alleen een subset van Unicode-tekens ondersteunt. Ik wou dat ik een grapje maakte.
Gegevenstoegang :
-
In uw applicatiecode (bijv. PHP), in welke DB-toegangsmethode u ook gebruikt, moet u de verbindingstekenset instellen op
utf8mb4
. Op deze manier voert MySQL geen conversie uit van zijn oorspronkelijke UTF-8 wanneer het gegevens aan uw applicatie overdraagt en vice versa. -
Sommige stuurprogramma's bieden hun eigen mechanisme voor het configureren van de verbindingstekenset, die zowel de eigen interne status bijwerkt als MySQL informeert over de codering die op de verbinding moet worden gebruikt - dit is meestal de voorkeursbenadering. In PHP:
-
Als u de BOB gebruikt abstractielaag met PHP ≥ 5.3.6, u kunt
tekenset
. specificeren in de DSN :$dbh = new PDO('mysql:charset=utf8mb4');
-
Als je mysqli gebruikt , kunt u
set_charset()
bellen :$mysqli->set_charset('utf8mb4'); // object oriented style mysqli_set_charset($link, 'utf8mb4'); // procedural style
-
Als je vastzit met gewone mysql maar toevallig PHP ≥ 5.2.3 draait, kunt u
mysql_set_charset .
-
-
Als het stuurprogramma geen eigen mechanisme biedt voor het instellen van de verbindingstekenset, moet u mogelijk een query uitvoeren om MySQL te vertellen hoe uw toepassing verwacht dat gegevens over de verbinding worden gecodeerd:
STEL NAMEN IN 'utf8mb4'
. -
Dezelfde overweging met betrekking tot
utf8mb4
/utf8
is van toepassing zoals hierboven.
Uitvoer :
-
Als uw toepassing tekst naar andere systemen verzendt, moeten zij ook op de hoogte worden gesteld van de tekencodering. Bij webapplicaties moet de browser worden geïnformeerd over de codering waarin gegevens worden verzonden (via HTTP-responsheaders of HTML-metadata ).
-
In PHP kun je de
default_charset gebruiken
php.ini optie, of geef handmatig hetContent-Type
op MIME-header zelf, dat is gewoon meer werk maar heeft hetzelfde effect. -
Bij het coderen van de uitvoer met
json_encode()
, voegJSON_UNESCAPED_UNICODE
toe als een tweede parameter.
Invoer :
-
Helaas moet u elke ontvangen string verifiëren als geldige UTF-8 voordat u deze probeert op te slaan of ergens te gebruiken. PHP's
mb_check_encoding()
doet de truc, maar je moet het religieus gebruiken. Er is echt geen manier om dit te omzeilen, aangezien kwaadwillende klanten gegevens kunnen indienen in elke codering die ze willen, en ik heb geen truc gevonden om PHP dit op een betrouwbare manier voor je te laten doen. -
Uit mijn lezing van de huidige HTML-specificatie , zijn de volgende sub-bullets niet nodig of zelfs niet meer geldig voor moderne HTML. Ik heb begrepen dat browsers werken met en gegevens indienen in de tekenset die voor het document is opgegeven. Als u zich echter op oudere versies van HTML (XHTML, HTML4, enz.) richt, kunnen deze punten nog steeds nuttig zijn:
- Alleen voor HTML vóór HTML5 :u wilt dat alle gegevens die door browsers naar u worden verzonden, in UTF-8 staan. Helaas, als je dit doet, is de enige manier om dit op een betrouwbare manier te doen, het toevoegen van de
accept-charset
toeschrijven aan al uwtags:
.
- Alleen voor HTML vóór HTML5 :merk op dat de W3C HTML-specificatie zegt dat clients standaard formulieren terug moeten sturen naar de server in welke tekenset de server ook gebruikt, maar dit is blijkbaar slechts een aanbeveling, vandaar de noodzaak om expliciet te zijn op elk afzonderlijk
tag.
- Alleen voor HTML vóór HTML5 :u wilt dat alle gegevens die door browsers naar u worden verzonden, in UTF-8 staan. Helaas, als je dit doet, is de enige manier om dit op een betrouwbare manier te doen, het toevoegen van de
Overige code-overwegingen :
-
Het is duidelijk dat alle bestanden die u wilt gebruiken (PHP, HTML, JavaScript, enz.) gecodeerd moeten zijn in geldige UTF-8.
-
Elke keer dat u een UTF-8-tekenreeks verwerkt, moet u ervoor zorgen dat u dit veilig doet. Dit is helaas het moeilijkste. Je zult waarschijnlijk uitgebreid gebruik willen maken van PHP's
mbstring
extensie. -
De ingebouwde tekenreeksbewerkingen van PHP zijn niet standaard UTF-8 veilig. Er zijn een aantal dingen die je veilig kunt doen met normale PHP-tekenreeksbewerkingen (zoals aaneenschakeling), maar voor de meeste dingen moet je de equivalente
mbstring
gebruiken functie. -
Om te weten wat je doet (lees:niet verknoeien), moet je UTF-8 echt kennen en weten hoe het werkt op het laagst mogelijke niveau. Bekijk een van de links van utf8.com voor een aantal goede bronnen om alles te leren wat u moet weten.