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 i php.ini eller manuellt php.ini MIME-rubriken Content-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 en utf8mb4_* -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ända utf8 , 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' .



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow