Mám takový problém: když nastavím kódování svých stránek utf-8, tak mi to místo českých znaků píše nesmysly, ale u dat z databáze to vypisuje správně. Když nastavím kódování svých stránek windows-1250, tak mi to správně vypisuje text stránek, ale blbě data z databáze.
Prosím o radu.
Při tvorbě webu musíte dodržet základní pravidlo. Vše musí být ve stejném kódování. Jak stránky, tak i databáze.
Ve Vašem případě jsou dvě možnosti.
1) Stránky převést do kódování utf-8. Pouhé přepsání hlavičky nestačí. Třeba PSPad umí převádět stránky do jiných kódování.
2) Použít mysql konvertor SET NAMES. Je třeba to správně nastavit, jinak naděláte ještě větší paseku.
soubor UTF ma obvykle 2x takovou velikost nez soubor neUTF, protoze na kazdy znak/pismenko pouziva kod z tabulek 65.536 a ne z 256, aby mohl bez problemu zobrazit treba cinske znaky a jina kodovani. Takze reseni viz Tomik.
A - bud si najdi program, co umi prevest WIN do UTF
B - nebo nastav SET NAMES, aby ti data z databaze posilal ve WIN kodovani.
Problem tedy spociva v tom, ze stranku nemas v UTF.
peta: Soubor v UTF-16 má skutečně dvojnásobnou velikost než třeba ISO-Latin2 nebo Windows-1250. Pro UTF-8 to však neplatí, ten je zpravidla jen o něco málo větší.
Tabulka Unicode nemá 65.536 znaků, ale mnohem víc - 2^31. Proč by jinak existovalo kódování UTF-32?
UTF-8, UTF-7, UTF-16, UTF-32, jeste dalsi kodovani? :)
Proste nejjednodussi test je zkopirovat to do poznamkoveho bloku a pokud jsou velikosti shodne nebo blizke sobe (odstraneni, pridani mezer, enteru), pravdepodobne to neni UTF.
Už vím, proč peta píše bez "háčků a čárků", aby soubory s jeho texty nebyly v UTF-8 větší!
Překlad pro Peta:
Uz vim, proc pises bez hacku a carek, aby soubory s tvyma textama nebyly v UTF-8 vetsi!
Bez hacku se vse zobrazi spravne v jakemkoliv prohlizeci, systemu...
Neni to davno, co jsem resil tiketovaci system. Pouzil jsem nejake free jednoduche reseni napojene na pop3 a jediny problem celeho mailoveho programu byla diakritika. Cely program jsem tudiz prepsal, jenze to nepomohlo, protoze hlavicka a body mohlo mit ruznou diakritiku. Ted neco z toho vubec php nezvladalo a iconvert se nedal pouzit, protoze pulku zpravy proste smazal, protoze tam objevil nelegalni znak.
Neni to davno, co jsem potreboval prenest soubory na win v nouzovem rezimu nebo nejakou utilitou, co neumela diakritiku. Vubec win a diakritika u rouboru, to je samo o sobe maler :) Zvlast, kdyz se prevadi mezi verzi CZ a EN / DE. To se pak clovek nestaci divit, kolik naskace pri kopirovani erroru.
Jinymi slovy mam i duvody, ale predevsim jsem zvykly psat bez diakritiky.
Jestli ti to vadi, nech si to vyrezat a nespamuj forum offtopicama, kdyz znas mail.
peta rulez :-)
Jenom jsem čekal zase třicet řádků z generátoru náhodných odkazů do manuálu a na tvoje stránky.
Co se týká UTF:
Pokud mám text, který lze zakódovat ascii (anglické znaky), v UTF-8 může vypadat naprosto stejně. Další znaky se kódují dvěma byty (jeden musí být nad 127). Takže dvojnásobek místa zabírají právě jenom písmenka s diakritikou.
K problému:
Doporučuji Tomík 1)
Krab: Znaky nad 127 se v UTF-8 kódují na 2-6 bytů, všechny musí být nad 127. Se zbytkem souhlasím.
<HTML>Krab: sice tě opravil už Kit, ale to kódování UTF-8 je celkem zajímavé. Doporučuju přečíst si <a href="http://en.wikipedia.org/wiki/UTF-8">
článek na Wikipedii</a>.</HTML>
Kit, Nípal: Aha, děkuju za opravu. Jinak drobné rýpnutí, když už jsem si něco přečetl :-)
"UTF-8 encodes each character (code point) in 1 to 4 octets." (wiki)
Krab: Četl jsi i českou verzi http://cs.wikipedia.org/wiki/UTF-8 ?
Na všechny dosud známé znaky stačí v současné době 1-4 byty, ale je zde prostor pro 2^31 znaků, aby se to v budoucnu už nemuselo rozšiřovat. Horní limit je 6 bytů/znak.
<HTML>Krab: Že já na ten článek odkázal. Je v něm taková pěkná tabulka a v ní (světe, div se) tyto řádky:
<pre style="padding-bottom: 0px; margin-bottom: 0px;">11111000-11111011 F8-FB 248-251 Restricted by RFC 3629: start of 5-byte sequence</pre>
<pre style="padding-top: 0px; margin-top: 0px;">11111100-11111101 FC-FD 252-253 Restricted by RFC 3629: start of 6-byte sequence</pre></HTML>