Firebird s kódováním WIN1250, výstup JSON
- Milan Obrtlík
- Člen | 50
Dobrý den, mám menší problém s tím, že se mi zobrazují nekorektně
české znaky.
Data načítám z Firebird databáze (znaková sada WIN1250, konvert databáze
do UTF-8 není možný).
Když ale chci data naládovat do $this->payload->data, tak mi to vyhodí
výjimku, že to teda jako ne, že tam patří jen a pouze UTF-8 znaky
(Nette\Utils\JsonException: Invalid UTF-8 sequence). Tak si říkám, pohoda,
jenom překonvertuju WIN1250 do UTF-8. Tak googlím a teda jako nic moc. Má
s tím někdo zkušenosti?
- Milan Obrtlík
- Člen | 50
Nakonec jsem vyřešil problém s kódováním. V dokumentaci PHP je funkce strtr a v komentářích je tam přímo od nějakého Čecha „konvertor“
function cp1250_to_utf2($text){
$dict = array(chr(225) => 'á', chr(228) => 'ä', chr(232) => 'č', chr(239) => 'ď',
chr(233) => 'é', chr(236) => 'ě', chr(237) => 'í', chr(229) => 'ĺ', chr(229) => 'ľ',
chr(242) => 'ň', chr(244) => 'ô', chr(243) => 'ó', chr(154) => 'š', chr(248) => 'ř',
chr(250) => 'ú', chr(249) => 'ů', chr(157) => 'ť', chr(253) => 'ý', chr(158) => 'ž',
chr(193) => 'Á', chr(196) => 'Ä', chr(200) => 'Č', chr(207) => 'Ď', chr(201) => 'É',
chr(204) => 'Ě', chr(205) => 'Í', chr(197) => 'Ĺ', chr(188) => 'Ľ', chr(210) => 'Ň',
chr(212) => 'Ô', chr(211) => 'Ó', chr(138) => 'Š', chr(216) => 'Ř', chr(218) => 'Ú',
chr(217) => 'Ů', chr(141) => 'Ť', chr(221) => 'Ý', chr(142) => 'Ž',
chr(150) => '-');
return strtr($text, $dict);
}
To ale neřeší problém s tím, že když pomocí nette payloadu pošlu JSON, tak je to stejně rozbité. Kvůi tomu jsem založil nové vlákno.
- Milan Obrtlík
- Člen | 50
Jsou dva případy, ten první
iconv('WIN1250', 'UTF-8', 'Řáďící');
vypíše chybu
iconv(): Wrong charset, conversion from `WIN1250' to `UTF-8' is not allowed
a ten druhý
iconv('CP1250', 'UTF-8', 'Řáďící');
vypíše
iconv(): Detected an illegal character in input string
Každopádně toto je elegantně vyřešeno pomocí strtr.
- Milan Obrtlík
- Člen | 50
No ty znakové sady, to je pěkný trolling.
Funkční zápisy WIN1250 jsou
windows-1250, WINDOWS-1250, CP1250
Nefunkční win-1250, win1250, WIN-1250, WIN1250
Všímavější si asi všimli, že jsem předtím psal „CP1250 nefunguje“. To bylo způsobeno tím, že jsem používal metodu sendPayload, u které si nemůžu zvolit znakovou sadu. Takže mi to neodeslalo korektně ani toto:
["test"=>"Řáďící číšňík"]
Jak poradil @Mysteria v jiném vlákně, pro odeslání českých znaků přes JSON je potřeba
$this->sendResponse(new \Nette\Application\Responses\JsonResponse($data, 'application/json; charset=utf-8'));
Protože jsem líný, chtěl bych, aby se mi převádělo kódování WIN1250 automaticky. Je možné přepsat DIBI, aby se mi z \Dibi::query($sql) vracely už přeformátované data?