Mieszasz tutaj interfejsy API, mysql_* i mysqli_* nie miesza. Powinieneś trzymać się mysqli_ (jak się wydaje i tak jesteś), jako mysql_* funkcje są przestarzałe i całkowicie usunięte w PHP7.
Twój rzeczywisty problem to gdzieś problem z zestawem znaków. Oto kilka wskazówek, które pomogą Ci uzyskać właściwy zestaw znaków dla Twojej aplikacji. Obejmuje to większość ogólnych problemów, z którymi można się zmierzyć podczas tworzenia aplikacji PHP/MySQL.
- WSZYSTKIE atrybuty w całej aplikacji muszą być ustawione na UTF-8
- Zapisz dokument jako UTF-8 bez BOM (jeśli używasz Notepad++, jest to
Format->Convert to UTF-8 w/o BOM) -
Nagłówek zarówno w PHP, jak i HTML powinien być ustawiony na UTF-8
-
HTML (wewnątrz
<head></head>tagi):<meta charset="UTF-8"> -
PHP (na górze pliku, przed jakimkolwiek wyjściem):
header('Content-Type: text/html; charset=utf-8');
-
-
Po połączeniu się z bazą danych ustaw zestaw znaków na UTF-8 dla obiektu połączenia, w ten sposób (bezpośrednio po połączeniu)
mysqli_set_charset($conn, "utf8"); /* Procedural approach */ $conn->set_charset("utf8"); /* Object-oriented approach */To jest dla
mysqli_*, są podobne dlamysql_*i PDO (patrz dół tej odpowiedzi). -
Upewnij się również, że twoja baza danych i tabele są ustawione na UTF-8, możesz to zrobić w ten sposób:
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;(Żadne już zapisane dane nie zostaną przekonwertowane na właściwy zestaw znaków, więc musisz to zrobić z czystą bazą danych lub zaktualizować dane po wykonaniu tej czynności, jeśli są uszkodzone znaki).
- Jeśli używasz
json_encode(), może być konieczne zastosowanieJSON_UNESCAPED_UNICODEflaga, w przeciwnym razie przekonwertuje znaki specjalne na ich odpowiednik szesnastkowy.
Pamiętaj, że WSZYSTKO w całym potoku kodu musi być ustawiony na UFT-8, w przeciwnym razie możesz napotkać uszkodzone znaki w swojej aplikacji.
Oprócz tej listy mogą istnieć funkcje, które mają określony parametr do określenia zestawu znaków. W instrukcji dowiesz się o tym (przykładem jest htmlspecialchars()
).
Istnieją również specjalne funkcje dla znaków wielobajtowych, na przykład:strtolower() nie zmniejszy znaków wielobajtowych, w tym celu będziesz musiał użyć mb_strtolower() , zobacz to demonstracja na żywo
.
Uwaga 1 :Zauważ, że jego miejsce oznaczone jako utf-8 (z myślnikiem) i gdzieś jako utf8 (bez tego). Ważne jest, aby wiedzieć, kiedy ich użyć, ponieważ zwykle nie są one wymienne. Na przykład HTML i PHP chcą utf-8 , ale MySQL nie.
Uwaga 2 :W MySQL „zestaw znaków” i „porównanie” to nie to samo, zobacz Różnica między kodowaniem a sortowaniem?
. Oba powinny być jednak ustawione na utf-8; generalnie sortowanie powinno być albo utf8_general_ci lub utf8_unicode_ci , zobacz UTF-8:Ogólne? Kosz? Unicode?
.
Uwaga 3 :Jeśli używasz emotikonów, MySQL musi być określony za pomocą utf8mb4 zestaw znaków zamiast standardowego utf8 , zarówno w bazie danych, jak iw połączeniu. HTML i PHP będą miały po prostu UTF-8 .
Ustawianie UTF-8 za pomocą mysql_ i ChNP
-
PDO:Odbywa się to w DSN twojego obiektu. Zwróć uwagę na
charsetatrybut,$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass"); -
mysql_:Robi się to bardzo podobnie domysqli_*, ale nie przyjmuje obiektu połączenia jako pierwszego argumentu.mysql_set_charset('utf8');