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
mbstringPHP.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-charsetdo 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_charsetwphp.inilub samodzielnie samodzielnie wydać nagłówek MIMEContent-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
utf8mb4we 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
utf8mb4kodowaniautf8mb4jeśliutf8mb4_*sortowanieutf8mb4_*(bez jawnego zestawu znaków). - Starsze wersje MySQL (<5.5.3) nie obsługują
utf8mb4wię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/utf8jak wyżej):Jeśli używasz warstwy abstrakcji PDO z PHP ≥ 5.3.6, możesz określić
charsetw 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 styleJeś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 styleJeś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'.