Moja pierwsza strona steakovercooked.com powstała w 2006 roku (9 lat temu). W tamtym czasie nie wiedziałem zbyt wiele o kodowaniu plików/zestawie znaków, a także UTF-8 nie był wtedy tak popularny na stronach internetowych. W dzisiejszych czasach UTF-8 staje się tak popularny, że WordPress używa kodowania UTF-8 w całej witrynie, dzięki czemu można bez problemu wyświetlać praktycznie dowolny język w jednej witrynie.
UTF-8-ascii-izo-8859-1
Strona kodowa wszystkich plików (PHP, HTML, CSS i kilka innych plików tekstowych) była w większości na stronach kodowych ANSI, a chińskie znaki są zakodowane wielobajtowo. Aby wyświetlić te znaki (w kodowaniu ANSI) w przeglądarce, musisz umieścić je między tagiem nagłówka w HTML, aby przeglądarki mogły zrozumieć:
W HTML5 możesz pisać znacznie krótszą metodą:
Tak więc większość użytkowników spoza Chin nie widzi znaków, chyba że zainstalują pakiet językowy GB2312 dla przeglądarki. Ponadto jest prawdopodobne, że niektórzy zwykli edytorzy tekstu zepsują znaki. Pojedynczy znak w języku chińskim to dwa bajty, ale czasami edytor tekstu po prostu tnie na połówki.
Konwertuj pliki (ANSI) na UTF-8
Zanim zmienisz meta nagłówek na :
Musisz przekonwertować pliki na kodowanie UTF-8. Jest na to wiele sposobów. Najprostszą metodą byłoby użycie notatnika do zapisania jako kodowanie „UTF-8".
notatnik-konwertuj-do-utf-8
Jeśli masz dużo plików, możesz to zrobić za pomocą narzędzia iconv w systemie Linux (serwer VPS ). Poniższy skrypt (zapisany do nazwy pliku np. toUTF) skonwertuje pojedynczy plik do UTF-8.
#!/bin/bash
# https://helloacm.com
if [ "$#" -ne 1 ] ||! [ -r "$1" ]; then
echo "Usage: $0 file1"
exit 1
fi
x=`file -bi $1 | grep 'utf' | wc -l`
if [ $x -eq 1 ]; then
echo "$1 already converted"
else
echo converting $1 to UTF8
iconv -f "gb2312" -t "UTF-8" $1 -o $1
fi
Musimy unikać dwukrotnej konwersji, aby zapobiec możliwym problemom. file -bi $1 | grep 'utf' | wc -l
Sprawdzi, czy plik został już zakodowany w UTF-8. Polecenie iconv -f “gb2312" -t “UTF-8” $1 -o $1 przekonwertuje plik na UTF-8 z gb2132 (zmień to odpowiednio).
Teraz możemy zapętlić wszystkie pliki z rozszerzeniem *.php w bieżącym katalogu i wszystkich podkatalogach:
for x in `find. -type f -name "*.php"`; do
toUTF $x
done
Konwertuj bazę danych MySQL na UTF-8
W moim przypadku wszystkie moje poprzednie bazy danych mysql mają domyślnie kodowanie ANSI (porównanie latin1_swedish_ci ), które są uszkodzone w nowoczesnych przeglądarkach, jeśli istnieją znaki GB2312 (wielobajtowe). Na przykład PhpMyAdmin ma kodowanie UTF-8, a znaki ANSI/GB2312 będą wyświetlane w przeglądarce jako uszkodzone.
Aby zapisać te dane w UTF-8, najłatwiejszą metodą jest wyeksportowanie tabeli (zalecane phpMyAdmin) do pliku SQL; upewnij się, że eksportujesz go za pomocą ISO 8859-1 (pełne pokrycie języka angielskiego). iso 8859-1 jest również znany jako ANSI, ale znaki GB2312 mogą być przechowywane jako ciąg wielobajtowy. Jeśli otworzysz SQL w notatniku, nadal możesz zobaczyć chińskie znaki, wystarczy zapisać jako kodowanie „UTF-8″.
phpmyadmin
Och, jeszcze jedna rzecz przed zapisaniem jako UTF-8. Należy wyszukać i zamienić słowo „latin1″ na „utf-8″ w pliku SQL. Następnie ponownie zaimportuj SQL za pomocą phpMyAdmin, więc jesteś gotowy do pracy. Wszystkie dane zostaną zachowane i zmienione na kodowanie UTF-8, a sortowanie zostanie zmienione (dla varchar, text, longtext itp.) na utf8_general_ci.
Ustawienia MySQL UTF-8
W PHP możesz ustawić domyślny zestaw znaków:
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET utf8");
Podobnie działa mysql_set_charset :
Możesz także ustawić domyślny zestaw znaków podczas uruchamiania serwera MySQL (zapisz narzuty funkcji dla wywołania powyższych funkcji). Przejdź do edycji pliku /etc/mysql/my.cnf i zrestartuj serwer mysql np. sudo service mysql restart. Dodaj następujące elementy do my.cnf :
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
Dlaczego UTF-8?
UTF-8 traktuje litery alfabetu 1 bajt (tak samo jak ANSI), ale używa 3 bajtów do reprezentowania 1 chińskiego znaku, podczas gdy 2 bajty są używane, jeśli są zakodowane przez GB2312. Dlatego też, jeśli twoje strony zawierają dużo chińskich znaków, ANSI/GB2312 oszczędza miejsce, jednak UTF-8 i ANSI zajmują dokładnie tę samą przestrzeń, jeśli chodzi tylko o litery angielskie.
UTF-8 oszczędza kłopotów w przyszłości. Po konwersji do UTF-8 nie musisz się martwić o zestaw znaków lub kodowanie. UTF-8 jest bardziej przyjazny dla znaków międzynarodowych, niż większość przeglądarek wie, jak poprawnie wyświetlać tekst. W moim przypadku muszę przekonwertować pliki na kodowanie UTF-8, ponieważ moje ulubione edytory tekstu, zarówno PsPAD, jak i Sublime text, nie wiedzą, jak poprawnie wyświetlić ANSI/GB2312.