Przechowywanie danych :
-
Określ
utf8mb4
zestaw znaków we wszystkich tabelach i kolumnach tekstowych w Twojej bazie danych. To sprawia, że MySQL fizycznie przechowuje i pobiera wartości zakodowane natywnie w UTF-8. Zwróć uwagę, że MySQL domyślnie użyjeutf8mb4
kodowanie, jeśliutf8mb4_*
określono sortowanie (bez żadnego wyraźnego zestawu znaków). -
W starszych wersjach MySQL (<5.5.3) będziesz niestety zmuszony używać po prostu
utf8
, który obsługuje tylko podzbiór znaków Unicode. Chciałbym żartować.
Dostęp do danych :
-
W kodzie aplikacji (np. PHP), w dowolnej metodzie dostępu do bazy danych, której używasz, 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 aplikacji i na odwrót. -
Niektóre sterowniki udostępniają własny mechanizm konfiguracji zestawu znaków połączenia, który zarówno aktualizuje swój własny stan wewnętrzny, jak i informuje MySQL o kodowaniu, które ma być używane w połączeniu — jest to zwykle preferowane podejście. W PHP:
-
Jeśli używasz PDO warstwa abstrakcji z PHP ≥ 5.3.6, możesz określić
charset
w DSN :$dbh = new PDO('mysql:charset=utf8mb4');
-
Jeśli używasz mysqli , możesz zadzwonić
set_charset()
:$mysqli->set_charset('utf8mb4'); // object oriented style mysqli_set_charset($link, 'utf8mb4'); // procedural style
-
Jeśli utkniesz ze zwykłym mysql ale używasz PHP w wersji 5.2.3, możesz zadzwonić
mysql_set_charset
.
-
-
Jeśli sterownik nie zapewnia własnego mechanizmu ustawiania zestawu znaków połączenia, może być konieczne wysłanie zapytania, aby poinformować MySQL, w jaki sposób aplikacja oczekuje zakodowania danych dotyczących połączenia:
USTAW NAZWY 'utf8mb4'
. -
Ta sama uwaga dotycząca
utf8mb4
/utf8
obowiązuje jak powyżej.
Wyjście :
-
Jeśli Twoja aplikacja przesyła tekst do innych systemów, będą one również musiały zostać poinformowane o kodowaniu znaków. W przypadku aplikacji internetowych przeglądarka musi być informowana o kodowaniu, w jakim wysyłane są dane (poprzez nagłówki odpowiedzi HTTP lub metadane HTML ).
-
W PHP możesz użyć
default_charset
php.ini lub ręcznie wydajContent-Type
Sam nagłówek MIME, co jest po prostu więcej pracy, ale daje ten sam efekt. -
Podczas kodowania danych wyjściowych za pomocą
json_encode()
, dodajJSON_UNESCAPED_UNICODE
jako drugi parametr.
Wprowadzanie :
-
Niestety, 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()
załatwia sprawę, ale musisz jej używać religijnie. Naprawdę nie ma sposobu na obejście tego, ponieważ złośliwi klienci mogą przesyłać dane w dowolnym kodowaniu, a ja nie znalazłem sztuczki, która pozwoliłaby PHP zrobić to niezawodnie. -
Z mojej lektury aktualnej specyfikacji HTML , poniższe podpunkty nie są już potrzebne ani nawet ważne dla współczesnego kodu HTML. Rozumiem, że przeglądarki będą pracować i przesyłać dane w zestawie znaków określonym dla dokumentu. Jeśli jednak kierujesz reklamy na starsze wersje HTML (XHTML, HTML4 itp.), poniższe wskazówki mogą być przydatne:
- Tylko dla HTML przed HTML5 :chcesz, aby wszystkie dane przesyłane do Ciebie przez przeglądarki były w UTF-8. Niestety, jeśli pójdziesz jedyną drogą, aby to zrobić niezawodnie, jest dodanie
accept-charset
atrybut do wszystkich Twoichtagi:
.
- Tylko dla HTML przed HTML5 :zauważ, że specyfikacja HTML W3C mówi, że klienci "powinni" domyślnie wysyłać formularze z powrotem do serwera w dowolnym zestawie znaków, który serwer obsługiwał, ale jest to najwyraźniej tylko zalecenie, stąd potrzeba wyraźnego określenia każdego pojedynczego
tag.
- Tylko dla HTML przed HTML5 :chcesz, aby wszystkie dane przesyłane do Ciebie przez przeglądarki były w UTF-8. Niestety, jeśli pójdziesz jedyną drogą, aby to zrobić niezawodnie, jest dodanie
Inne kwestie związane z kodem :
-
Oczywiście wszystkie pliki, które będziesz udostępniać (PHP, HTML, JavaScript itp.) powinny być zakodowane w poprawnym UTF-8.
-
Musisz się upewnić, że za każdym razem, gdy przetwarzasz ciąg znaków UTF-8, robisz to bezpiecznie. To jest niestety najtrudniejsza część. Prawdopodobnie będziesz chciał szeroko wykorzystać
mbstring
rozszerzenie. -
Wbudowane operacje na ciągach PHP nie domyślnie sejf UTF-8. Jest kilka rzeczy, które możesz bezpiecznie zrobić za pomocą normalnych operacji na ciągach PHP (takich jak konkatenacja), ale dla większości rzeczy powinieneś użyć równoważnego
mbstring
funkcja. -
Aby wiedzieć, co robisz (czytaj:nie zepsuj tego), naprawdę musisz znać UTF-8 i jak działa na najniższym możliwym poziomie. Sprawdź dowolne linki z utf8.com aby uzyskać dobre zasoby, aby dowiedzieć się wszystkiego, co musisz wiedzieć.