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
wphp.ini
lub 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
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
kodowaniautf8mb4
jeśliutf8mb4_*
sortowanieutf8mb4_*
(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'
.