Firebird s kódováním WIN1250, výstup JSON

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Milan Obrtlík
Člen | 50
+
0
-

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?

CZechBoY
Člen | 3608
+
0
-

Iconv? :)

Milan Obrtlík
Člen | 50
+
0
-

iconv nepodporuje CP1250 to UTF-8

Milan Obrtlík
Člen | 50
+
0
-

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.

CZechBoY
Člen | 3608
+
0
-
iconv('CP1250', 'UTF-8', Řáďící');

Vyhodi jakou error hlasku teda?

Milan Obrtlík
Člen | 50
+
0
-

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.

ViPEr*CZ*
Člen | 818
+
+1
-

Tak nevím kde, ale někde je něco špatně. Nedávno jsem použil iconv(‚windows-1250‘, ‚utf-8‘, $value) a v pohodě. Zkoušeno jak na woknech, tak na linuxu. Na woknech 7.0.3 a na linuxu nějaká 5.4 dokonce.

Milan Obrtlík
Člen | 50
+
0
-

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?