Autor Zpráva
xlifer
Profil
I když nastavím "Content-Type: text/html; charset=windows-1250" do hlavičky odesílaných dat v JS níže, tak vždy na výstupu v cílovém skript.php je kódování v UTF-8 i přes to, že mám uvedený ve skript.php header("Content-Type: text/html; charset=Windows-1250"). Jen upřesním, že JS je v kódování windows-1250, stejně tak předávaná data do parametru text=

parametry = "?text="+encodeURIComponent("nějaký text v kódování windows-1250");
setTimeout(function () {
        send_xmlhttprequest(function (xmlhttp) {
            if (xmlhttp.readyState == 4) {
                divbox.innerHTML = xmlhttp.responseText;
            }
        }, 'POST', 'skript.php', parametry, {"Content-type": "application/x-www-form-urlencoded", "Content-length": parametry.length});
    }, 1);

Pročetl jsem zde na fóru nějaké vlákna, kde se řeší kódování AJAJxu, ale řešení jsem nenašel ani nevyčetl, zda to lze nebo vubec nelze řešit?
_es
Profil
xlifer:
A ako vyzerá funkcia send_xmlhttprequest? Alebo, odkiaľ si ju prebral? Stránka je v akom kódovaní? Problém je v čom - nejaké znaky zle zobrazované?
Chamurappi
Profil
Reaguji na xlifera:
Problém není v tom, co deklaruješ. Funkce encodeURIComponent používá vždy UTF-8, protože to je oficiálně standardní kódování všech URL.

Kdysi dávno jsem si napsal vlastní obdobu, která umí převod do windows-1250:
function encodeURIComponentWindows1250(c)
{
  var windows1250 = "\u20ac\u0081\u201a\u0083\u201e\u2026\u2020\u2021\u0088\u2030\u0160\u2039\u015a\u0164\u017d\u0179\u0090\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u0098\u2122\u0161\u203a\u015b\u0165\u017e\u017a\u00a0\u02c7\u02d8\u0141\u00a4\u0104\u00a6\u00a7\u00a8\u00a9\u015e\u00ab\u00ac\u00ad\u00ae\u017b\u00b0\u00b1\u02db\u0142\u00b4\u00b5\u00b6\u00b7\u00b8\u0105\u015f\u00bb\u013d\u02dd\u013e\u017c\u0154\u00c1\u00c2\u0102\u00c4\u0139\u0106\u00c7\u010c\u00c9\u0118\u00cb\u011a\u00cd\u00ce\u010e\u0110\u0143\u0147\u00d3\u00d4\u0150\u00d6\u00d7\u0158\u016e\u00da\u0170\u00dc\u00dd\u0162\u00df\u0155\u00e1\u00e2\u0103\u00e4\u013a\u0107\u00e7\u010d\u00e9\u0119\u00eb\u011b\u00ed\u00ee\u010f\u0111\u0144\u0148\u00f3\u00f4\u0151\u00f6\u00f7\u0159\u016f\u00fa\u0171\u00fc\u00fd\u0163\u02d9";
  return String(c).replace(/([\u0000-\u007F]+)|[\u0080-\uFFFF]/g, function(m, ascii)
  {
    if(ascii) return encodeURIComponent(m);
    var pos = windows1250.indexOf(m);
    return (pos > -1) ? "%" + (pos + 128).toString(16) : "%26%23" + m.charCodeAt(0) + "%3B";
  });
}

Ale už ji nepoužívám, protože jsem zjistil, že server – alespoň v mém případě – pochopí data enkódovaná v UTF-8, když nastavím Content-Type: application/x-www-form-urlencoded; charset=utf-8.
Edit: Oprava překlepu – enkódovaná, ne nekódovaná. Aha, ona mi to sama opravuje kontrola pravopisu :-)
snazimse
Profil
Chamurappi:
Ale už ji nepoužívám, protože jsem zjistil, že server – alespoň v mém případě – pochopí data nekódovaná v UTF-8, když nastavím Content-Type: application/x-www-form-urlencoded; charset=utf-8.

Co to znamená pochopí? Jakože je umí zpracovat? Je vůbec vhodné dneska, ještě používat jiné kodování než UTF-8 v Evropě?

Díky
_es
Profil
Okrem toho, použitie funkcie setTimeout s oneskorením 1 ms vyzerá veľmi pofidérne - asi to je pokus o nejakú „opravu“ obvyklého správania.
xlifer
Profil
Takže, když se nebudeme bavit o změně kódování celého webu, tak je asi jediné řešení převést UTF-8 kódování až uvnitř skriptu přes funkci iconv(); z UTF-8 na Windows-1250.
Chamurappi
Profil
V mém příspěvku byl překlep – chtěl jsem napsat data enkódovaná v UTF-8, ne nekódovaná.

Reaguji na snazimse:
Co to znamená pochopí? Jakože je umí zpracovat?
Jo. Prostě rozumí tomu charsetu v hlavičce Content-Type a vezme URL-enkódovaný vstup jako UTF-8, přestože stránka jinak běží v jiném kódování.
V mém případě šlo o IIS, netuším, jak se k tomu staví Apache a PHP.

Je vůbec vhodné dneska, ještě používat jiné kodování než UTF-8 v Evropě?
Myslím, že je to celkem jedno. Pro češtinu je datově nejúspornější kódování windows-1250, ale úspora v řádu bajtů zpravidla nestojí za řeč. U nového webu bych nejspíš zvolil UTF-8, u něčeho již existujícího se zpravidla nevyplácí kódování dodatečně měnit.


Reaguji na xlifera:
tak je asi jediné řešení
Čemu nerozumíš na příspěvku [#3]? Dostal jsi na stříbrném podnose hotové řešení… má snad ta moje funkce nějaký problém?
xlifer
Profil
Chamurappi:
Čemu nerozumíš na příspěvku [#3]? Dostal jsi na stříbrném podnose hotové řešení… má snad ta moje funkce nějaký problém?

Pochopil jsem to tak, že už funkci nepoužíváš, takže to není vhodné řešení i kvůli tomu důvodu, který tam uvádíš. Nemyslel jsem to nijak jinak a za řešení samozřejmě děkuji.

A kdyby jsi se měl rozhodnout jestli data převést přes JS (tvoje funkce) a odeslat již hotové data nebo až ve skriptu přes iconv, tak k čemu by jsi se příkláněl a z jakého důvodu? Díky za názor.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

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