Szukaj…


Uwagi

  • Musisz upewnić się, że za każdym razem, gdy przetwarzasz ciąg UTF-8, robisz to bezpiecznie. To niestety trudna część. Prawdopodobnie będziesz chciał w dużym stopniu korzystać z rozszerzenia mbstring PHP.

  • Wbudowane operacje PHP na łańcuchach nie są domyślnie bezpieczne dla UTF-8. Są pewne rzeczy, które możesz bezpiecznie zrobić przy pomocy normalnych operacji na łańcuchach PHP (np. Konkatenacja), ale dla większości rzeczy powinieneś użyć równoważnej funkcji mbstring .

Wejście

  • Powinieneś zweryfikować każdy otrzymany ciąg jako poprawny UTF-8, zanim spróbujesz go zapisać lub użyć w dowolnym miejscu. PHP mb_check_encoding() rozwiązuje ten problem, ale musisz z niego korzystać konsekwentnie. Naprawdę nie ma takiej możliwości, ponieważ złośliwi klienci mogą przesyłać dane w dowolnym kodowaniu, jakiego chcą.

    $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);
    }
    
  • Jeśli używasz HTML5, możesz zignorować ten ostatni punkt. Chcesz, aby wszystkie dane przesyłane do ciebie przez przeglądarki były w UTF-8. Jedynym niezawodnym sposobem na to jest dodanie atrybutu accept-charset do wszystkich tagów <form> sposób:

    <form action="somepage.php" accept-charset="UTF-8">
    

Wynik

  • Jeśli Twoja aplikacja przesyła tekst do innych systemów, będą musiały zostać również poinformowane o kodowaniu znaków. W PHP możesz użyć opcji default_charset w php.ini lub samodzielnie samodzielnie wydać nagłówek MIME Content-Type . Jest to preferowana metoda w przypadku celowania w nowoczesne przeglądarki.

    header('Content-Type: text/html; charset=utf-8');
    
  • Jeśli nie możesz ustawić nagłówków odpowiedzi, możesz także ustawić kodowanie w dokumencie HTML za pomocą metadanych HTML .

    • HTML5

      <meta charset="utf-8">
      
    • Starsze wersje HTML

      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      

Przechowywanie i dostęp do danych

W tym temacie opisano w szczególności UTF-8 i uwagi na temat używania go z bazą danych. Jeśli chcesz uzyskać więcej informacji o korzystaniu z baz danych w PHP, sprawdź ten temat .

Przechowywanie danych w bazie danych MySQL:

  • Określ zestaw znaków utf8mb4 we wszystkich tabelach i kolumnach tekstowych w bazie danych. To sprawia, że MySQL fizycznie przechowuje i pobiera wartości zakodowane natywnie w UTF-8.

    MySQL domyślnie utf8mb4 kodowania utf8mb4 jeśli utf8mb4_* sortowanie utf8mb4_* (bez jawnego zestawu znaków).

  • Starsze wersje MySQL (<5.5.3) nie obsługują utf8mb4 więc będziesz zmuszony użyć utf8 , który obsługuje tylko podzbiór znaków Unicode.

Dostęp do danych w bazie danych MySQL:

  • W kodzie aplikacji (np. PHP), niezależnie od używanej metody dostępu do bazy danych DB, musisz ustawić zestaw znaków połączenia na utf8mb4 . W ten sposób MySQL nie dokonuje konwersji ze swojego natywnego UTF-8, gdy przekazuje dane do twojej aplikacji i odwrotnie.

  • Niektóre sterowniki zapewniają własny mechanizm konfigurowania zestawu znaków połączenia, który zarówno aktualizuje swój wewnętrzny stan, jak i informuje MySQL o kodowaniu, które ma być używane w połączeniu. Jest to zazwyczaj preferowane podejście.

    Na przykład (to samo dotyczy utf8mb4 / utf8 jak wyżej):

    • Jeśli używasz warstwy abstrakcji PDO z PHP ≥ 5.3.6, możesz określić charset w DSN :

      $handle = new PDO('mysql:charset=utf8mb4');
      
    • Jeśli używasz mysqli , możesz wywołać 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
      
    • Jeśli utknąłeś w zwykłym mysql, ale akurat używasz PHP ≥ 5.2.3, możesz wywołać 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
      
    • Jeśli sterownik bazy danych nie zapewnia własnego mechanizmu ustawiania zestawu znaków połączenia, może być konieczne SET NAMES 'utf8mb4' zapytania w celu poinformowania MySQL, w jaki sposób aplikacja oczekuje, że dane połączenia zostaną zakodowane: SET NAMES 'utf8mb4' .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow