Kodowanie znaków czyli krzaki na stronie
Kodowanie znaków ustala się na stronie w znacznikach meta, przykład dla kodowania iso8859-2 czyli standard dla polskich stron:
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-2">
dodatkowo w konfigu apacza (/etc/httpd/conf/httpd.conf) znajduje się AddDefaultCharset - który jest standardowo ustawiony na iso8859-1 - można go albo zaremować albo przerobić na iso8859-2.
To pierwsze jest lepsze jeśli na serwerze mamy strony kodowane w kilku standardach.
dodatkowo można samemu wysłać taki nagłówek (header) z charsetem ze skryptu PHP
standard win1250, którego używa windows, czyli notatnik też, nie jest mile widziany na profesjonalnie wykonanych stronach.
jeżeli piszemy pod windowsem musimy się zatem zaopatrzyć jedno z poniższych:
- klawiaturę iso - taki drajwer
- edytor umiejący konwertować w locie
- tablicę konwersji i samemu konwertować
Osobiście używam trzeciego sposobu, a to dlatego, że ja piszę mało tekstów w skryptach. Prawie wszystko u mnie jest wrzucane do bazy i podczas wrzucania martwię się o odpowiednie kodowanie.
Poniżej przykład jak wyglądają polskie znaczki jak źle ustawimy kodowanie.
ĄąĆćĘꣳŃńÓ󌜏źŻż
ˇ±ĆćĘꣳŃńÓ󦶬ĽŻż
AaCcEeLlNnOoSsZzZz (ziet,rzet)
Jak widać win1250 od iso8859-2 różni się zaledwie 6-cioma znakami jeśli bierzemy pod uwagę tylko alfabet polski.
Bardzo często pojawia się pytanie dlaczego widać krzaki przy przechowywaniu tekstów w bazie. Chodzi o to, że tekst trzeba wyjmować z bazy używając tego samego kodowania, jak przy wkładaniu.
Nie mniej jednak bardzo pomocne mogą być następujące wpisy w /etc/my.cnf:
[client]
character-sets-dir=/usr/share/mysql/charsets
default-character-set=latin2
[mysqld]
default-collation=latin2_general_ci
character-set-server=latin2
language = /usr/share/mysql/polish/
Przejście z MySQLa 4.0 do MySQLa 4.1 oznacza niewielką łysinę na głowie. MySQL 4.1 trzyma w bazie znaki zakodowane w utf8 zatem jeżeli zadajemy mu pytanie to on sobie musi je przekonwertować na utf8, odpalić je i wynik przekonwertować na żądany charset.
Oczywiście po upgrejdzie przestają chodzić strony oparte na iso (złośliwość rzeczy martwych) - chodzi o to, że domyślnie klient (PHP) ma ustawione, że zaczyna gadać w utf8. Kwerendą set names latin2; wywoływaną tuż po zainicjowaniu mysql_connect() można go zmusić to gadania w bardziej cywilizowanym języku. Rozwiązaniem globalnym jest dodanie do /etc/my.cnf w sekcji [mysqld] linijki:
init-connect="SET NAMES latin2"