Notice: query (INSERT INTO lemat_stats_browser (day,browser,ilosc,internal) VALUES ('2024-11-23','Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)',1,'2')) failed at /home/lemat/lemat.priv.pl/stats.php:151: Array ( [0] => 22001 [1] => 1406 [2] => Data too long for column 'browser' at row 1 ) in /home/lemat/lemat.priv.pl/panel_adm/dbclass.inc.php on line 15

Warning: Cannot modify header information - headers already sent by (output started at /home/lemat/lemat.priv.pl/panel_adm/dbclass.inc.php:15) in /home/lemat/lemat.priv.pl/stats.php on line 174
Krzaki - Lemat, strona prywatna
Lemat, strona prywatna

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:

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"

Data utworzenia : 2004-01-15, data aktualizacji :2010-12-01

Skomentuj ten tekst

Komentarze:

Radek
2007-12-20 23:48:37
HTML +PHP + MySQL + polskie znaki
Bardzo przydatny artykuł, zaoszczędził mi mnóstwo czasu. Pozdrawiam Autora :)
quake
2006-12-17 00:07:07
doklejanie reklam
Na doklejanie reklam jest jeden ciekawy sposób. Zakładając, że doklejają kod PHP (!). Robisz na końcu swojego pliku exit(); i już nic się nie dokleja. To działa np. na friko.pl/osemka.pl :). A co do MySQL-a, to chyba nie warto inwestować w hosting z MySQL[5. Idealnie w ogóle jakby mieć do wyboru 4, 5 i jeszcze np. Postresa, no ale to już tylko marzenia za sporą kasę.
Odpowiedź Lemata:
Mówisz o: ; Automatically add files before or after any PHP document. auto_prepend_file = auto_append_file = I to niestety ma implikacje takie, że programiści od stron internetowych nie mogą wykorzystywać najnowszych narzędzi, bo jest trudność potem z deployem tego na takie tanie hostingi.
quake
2006-12-16 13:47:15
kodowanie
Rozwiązaniem prostszym i przyjemniejszym może być używanie UTF-8 wszędzie gdzie się da ;). Na dzień dobry odpadają problemy z wielojęzycznością serwisów.
Odpowiedź Lemata:
trzeba wziąć pod uwagę fakt, nie nie wszedzie hosting daje mysqla w wersji 4.1+, gdzie utf8 jest dość dobrze wspierany. Można wprawdzie stawiać serwisy na wcześniejszych wersjach bazy, ale jest to upierdliwe przy imporcie/exporcie - co zresztą było widać u nas w firmie. Acha - i niektóre (darmowe) hostingi potrafią coś doklejać do kodu HTML strony (statystyki/reklamy) trzeba uważać, żeby kodowanie było zgodne.
Protected by spf
[Nospam-PL.NET]
Seti@Home
www.php.net
© Lemat 2004 - ∞