Sök…
Anmärkningar
Du måste se till att du gör det säkert varje gång du bearbetar en UTF-8-sträng. Detta är tyvärr den svåra delen. Du kommer förmodligen att vilja använda PHP: s
mbstring
förlängning.PHPs inbyggda strängoperationer är inte som standard UTF-8 säkra. Det finns några saker du säkert kan göra med vanliga PHP-strängoperationer (som sammankoppling), men för de flesta saker bör du använda motsvarande
mbstring
funktion.
Inmatning
Du bör verifiera varje mottagen sträng som giltig UTF-8 innan du försöker lagra den eller använda den någonstans.
mb_check_encoding()
gör tricket, men du måste använda det konsekvent. Det finns verkligen ingen väg runt detta, eftersom skadliga klienter kan skicka in data i vilken kodning de vill.$string = $_REQUEST['user_comment']; if (!mb_check_encoding($string, 'UTF-8')) { // the string is not UTF-8, so re-encode it. $actualEncoding = mb_detect_encoding($string); $string = mb_convert_encoding($string, 'UTF-8', $actualEncoding); }
Om du använder HTML5 kan du ignorera den sista punkten. Du vill att all data som skickas till dig av webbläsare ska vara i UTF-8. Det enda pålitliga sättet att göra detta är att lägga till
accept-charset
attributet till alla dina<form>
-taggar så:<form action="somepage.php" accept-charset="UTF-8">
Produktion
Om din applikation överför text till andra system måste de också informeras om teckenkodningen. I PHP kan du använda alternativet
default_charset
iphp.ini
eller manuelltphp.ini
MIME-rubrikenContent-Type
själv. Detta är den föredragna metoden när du riktar dig till moderna webbläsare.header('Content-Type: text/html; charset=utf-8');
Om du inte kan ställa in svarhuvuden kan du också ställa in kodningen i ett HTML-dokument med HTML-metadata .
HTML5
<meta charset="utf-8">
Äldre versioner av HTML
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Datalagring och åtkomst
Detta ämne talar specifikt om UTF-8 och överväganden för att använda det i en databas. Om du vill ha mer information om hur du använder databaser i PHP, kolla in detta ämne .
Lagring av data i en MySQL-databas:
- Ange
utf8mb4
teckenuppsättningen i alla tabeller och textkolumner i din databas. Detta gör att MySQL fysiskt lagrar och hämtar värden som är kodade naturligt i UTF-8.MySQL kommer implicit att använda
utf8mb4
kodning om enutf8mb4_*
-samling anges (utan någon uttrycklig teckenuppsättning). - Äldre versioner av MySQL (<5.5.3) stöder inte
utf8mb4
så du kommer att tvingas användautf8
, som bara stöder en delmängd av Unicode-tecken.
Få åtkomst till data i en MySQL-databas:
I din applikationskod (t.ex. PHP), i vilken DB-åtkomstmetod du använder, måste du ställa in anslutningssatsen till
utf8mb4
. På detta sätt gör MySQL ingen konvertering från dess ursprungliga UTF-8 när den överlämnar data till din applikation och vice versa.Vissa drivrutiner tillhandahåller en egen mekanism för att konfigurera anslutningsteckenuppsättningen, som både uppdaterar sitt eget interna tillstånd och informerar MySQL om den kodning som ska användas på anslutningen. Detta är vanligtvis den föredragna metoden.
Till exempel (Samma övervägande avseende
utf8mb4
/utf8
gäller som ovan):Om du använder PDO- abstraktionslagret med PHP ≥ 5.3.6, kan du ange
charset
i DSN :$handle = new PDO('mysql:charset=utf8mb4');
Om du använder mysqli kan du ringa
set_charset()
:$conn = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db'); $conn->set_charset('utf8mb4'); // object oriented style mysqli_set_charset($conn, 'utf8mb4'); // procedural style
Om du sitter fast med vanlig mysql men råkar köra PHP ≥ 5.2.3, kan du ringa
mysql_set_charset
.$conn = mysql_connect('localhost', 'my_user', 'my_password'); $conn->set_charset('utf8mb4'); // object oriented style mysql_set_charset($conn, 'utf8mb4'); // procedural style
Om databasdrivrutinen inte har någon egen mekanism för att ställa in anslutningsteckenuppsättningen, kan du behöva utfärda en fråga för att berätta för MySQL hur din applikation förväntar sig att data om anslutningen ska kodas:
SET NAMES 'utf8mb4'
.