Autor Zpráva
Sirius
Profil
Zdravím,

mám problém s kódováním webu. Vše jsem vytvářel na lokálním serveru s kódováním Windows 1250 (Utf8 mi dělalo problémy). Vše fungovalo jak má, problém nastal ve chvíli nahrání na webový server. MySQL DB je ve verzi 4.0 (zde mám 5.1 a kódování cp1250_czech_cs) a tam, jak jsem zjistil, není možné nastavit kódování (předpokládám, že je tam ISO 8859-2, v žádné dokumentaci jsem to nenašel). Po nahrání do DB na novém serveru se rozsypali všechny české znaky. Ruční přepisování bych ještě vydržel, není toho zase tolik, ale i když nějaký znak v administraci upravím, tak se na stránce zobrazí špatně.

Situace s diakritikou je asi následující. Kódování je kódování stránky v hlavičce.

Kódování | Obyčejný      |              Text z DB
         |        text   | Vkládaný přes DB | Vkládaný přes příkaz v PHP
---------+---------------+-----------------------+----------------------
UTF-8    | nefunguje     | nefunguje             | nefunguje
---------+---------------+-----------------------+----------------------
Latin 2  | nefunguje     | funguje               | funguje
---------+---------------+-----------------------+----------------------
Win1250  | funguje       | nefunguje             | funguje
---------+---------------+-----------------------+----------------------


Co mám kde změnit, aby mi to fungovalo jak má? Jsem z toho už opravdu zoufalý.

Moderátor Chamurappi: Titulek „Kódování“ nevystihuje podstatu dotazu. Příště zkus prosím vymyslet lepší.
Joker
Profil
Funguje samozřejmě každé z nich, ale je potřeba, aby následující tři věci byly nastavené na stejné kódování:

- Kódování stránky (skutečné kódování v jakém je uložený soubor)
- Co o sobě říká stránka (kódování v content-type)
- Komunikační kódování s databází (kódování v SET NAMES)
Sirius
Profil
Joker

Nějak z toho nechápu jak tedy může být rozdíl ve vypisování dat, která vkládám v DB ručně a která vkládá skript na stránce. Ale to je vedlejší.

Co kde mám tedy nastavit a jaké kódování je nejlepší? Předpokládám, že asi UTF8, podle toho co jsem kde četl. Momentálně vím akorát, jak nastavit Content-Type, zbytek je pro mě cizí. Nějaký odkaz pro samostudium, nebo rada? (Vzhledem k časovým možnostem preferuji druhou možnost, ale budu rád za cokoliv. :)

Edit: SET NAMES taky vím jak použít, jsem si vzpomněl. Kódování souboru je pro mě pořád záhada.
Joker
Profil
Sirius:
jak tedy může být rozdíl ve vypisování dat, která vkládám v DB ručně a která vkládá skript na stránce.
Formulář pro vkládání dat ručně má nejspíš jiné kódování než skript.
edit: Resp. jeden z nich data posílá ve špatném kódování (v SET NAMES nastaví jiné kódování než v jakém data skutečně jsou)

Co kde mám tedy nastavit a jaké kódování je nejlepší?
Nastavení:
- Ukládání souboru: v editoru, ve kterém soubor upravujete
- Co o sobě říká stránka: hlavička content-type (buď v php přes header(), nebo v HTML meta content-type)
- Komunikační kódování s databází: SQL příkaz SET NAMES
Sirius
Profil
Všechny tři body splněny.

Ještě dotaz. Mám tedy zvolit UTF8? A jaký význam má v tom případě nastavení tabulek a samotné databáze na určité kódování?

Na lokálním serveru jsem měl SET NAMES, soubor i stránku ve Windows 1250, a dokud nebyla i DB v cp1250, tak to nefungovalo, takže se trochu bojím nemožnosti nastavit kódování v té čtyrce.
Joker
Profil
Sirius:
Jestli to je nový web od začátku, volil bych UTF-8.
Jestli jsou už dosavadní stránky ve windows-1250, dal bych windows-1250.

Jinak paradoxně kódování samotných tabulek v databázi by nemělo být tak zásadní, protože právě to komunikační kódování slouží k tomu, aby databáze převedla kódování vstupů do kódování daného sloupce v tabulce a naopak.
Sirius
Profil
Joker

Dobře, moc děkuju.

Chamurappi

Zkusím se polepšit. :)
Sirius
Profil
Tak jsem nahrál znovu celý obsah na server (čekal jsem na úpravu DNS), včetně DB a data vytažená z databáze se vypisují s otazníkama místo diakritiky. Na localhostu vše funguje jak má.

Soubory jsou kódované v UTF-8.
Content-Type je utf-8.
SET NAMES 'utf8'.
DB, včetně obsahu, je v utf8_general_ci. (Resp. v tomto kódování je na localhostu s MySQL 5.1, pak jsem ji exportoval v režimu kompatibility s 4.0 a nahrál na server.)

Už fakt nevím co s tím, zkoušel jsem posílat i jiné dotazy místo SET NAMES, které jsem našel po různých diskusích, ale ani to nepomohlo.

EDIT: Tak jsem kód poupravil na

 $setnames = mysql_query("SET NAMES 'utf8'");
  if ($setnames) {
    echo "Zvoleno UTF-8";
  }
  else {
    echo "Není zvoleno kódování.";
  }


Na localhostu vypíše "Zvoleno UTF-8", na serveru "Není zvoleno kódování". Projel jsem manuál MySQL pro verzi 4.0 a žádný příkaz SET NAMES jsem nenašel, z čehož soudím, že je to výtvor až novějších verzí MySQL. Jak to mám vyřešit?
Kajman_
Profil *
Znakové sady jsou v mysql od 4.1. Ve starších verzích to funguje tak, že jak tam data dáte, tak vypadnou.

Osobně bych doporučil přechod jiný server v rámci stejného hostingu nebo jiný hosting. V tak staré verzi tuším nefunguje více věcí, na kterými mužete smutnit.
Sirius
Profil
Kajman_
Web byl včera přesouván ze serveru s Windows na server s Linuxem, kvůli MySQL databázi. Jestli potřeba změnit hosting je zakončení 14-ti dní řešení různých problémů okolo hostingu, tak to majitel domény bude mít radost.

Raději bych to vyřešil jinak, jestli je to možné. Jdu se s tím ještě potrápit. Díky
Kajman_
Profil *
Když něco uložíte přímo na stránkách, tak to vypíše dobře? Rozbitá jsou jen data z prvotního exportu?
Sirius
Profil
Kajman_
V datech vkládaných přes web i těch z exportu nešla diakritika. Teď jsem zkusil DB před importem přehodit do Latin2, to samé u Content-Type a kódování souboru a ta jedna stránka fungovala. Zkusím i zbytek, snad to půjde.
Sirius
Profil
Vyřešeno:
Data z MySQL 5.1 vyexportována jako Latin2, poté nahrána do verze 4.0.
Soubory v kódování ISO 8859-2.
Údaje v hlavičce také nastaveny na ISO 8859-2.

Stále nevím, proč to nešlo s UTF-8, ani s Windows 1250, ale hlavně, že to teď funguje. :)

Díky všem za rady

PS: Nešlo mi editovat předchozí příspěvek.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: