abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 12:22 | Pozvánky

    Co se děje ve zprávách, ví asi každý - válka sem, clo tam, demonstrace na jednu i druhou stranu a bastlíř už má pocit, že se snad ani nic jiného neděje. To by však byl velký omyl a Virtuální Bastlírna je zde jako každý měsíc, aby vytáhla na světlo světa události ze světa vědy a techniky. Připojte se tedy nezávaznému povídání Strahovského MacGyvera! Co se tam bude probírat? PCBWay začalo dělat průhledné plošňáky, MARS končí s výrobou skříněk, FEL

    … více »
    bkralik | Komentářů: 0
    dnes 12:11 | IT novinky

    Guvernérka státu New York Kathy Hochul (Demokraté) plánuje novou legislativu, která by měla omezit výrobu 3D tištěných zbraní. Tento návrh zákona zavádí povinnost pro všechny 3D tiskárny prodávané ve státě New York obsahovat 'software' bránící ve výrobě zbraní. Návrh zákona rovněž zakazuje lidem sdílet 'digitální plány zbraní' (blueprinty) bez povolení. Existují důvodné obavy, že se tento nešťastný nápad může šířit do dalších zemí a ovlivnit celý 3D tisk jako takový. Ostatně, s podobnou regulací nedávno přišel i stát Washington.

    NUKE GAZA! 🎆 | Komentářů: 4
    dnes 05:11 | Komunita

    Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za prosinec 2025 a leden 2026 (YouTube). Zajímavé, že i v roce 2026 celou řadu problémů vyřeší falšování řetězce User-Agent.

    Ladislav Hagara | Komentářů: 2
    včera 20:11 | Komunita

    Bylo rozhodnuto, že Linux From Scratch (LFS) končí s podporou System V init. Nové verze knih s návody na instalaci vlastního linuxového systému ze zdrojových kódů už budou pouze se systemd.

    Ladislav Hagara | Komentářů: 6
    včera 17:00 | Nová verze

    Byla vydána nová verze 2026.1.0 "Like a Version" svobodného softwaru ScummVM (Wikipedie) umožňujícího bezproblémový běh mnoha klasických adventur na zařízeních, pro které nebyly nikdy určeny. Přehled novinek v poznámkách k vydání a na GitHubu. Změněno bylo číslování verzí. Předchozí verze byla 2.9.1.

    Ladislav Hagara | Komentářů: 2
    včera 14:55 | IT novinky

    Internetový prohlížeč Firefox bude mít nové ovládací prvky pro umělou inteligenci, které umožní uživatelům vypnout vestavěné AI funkce přímo v nastavení prohlížeče. Jednotlivě půjde vypnout nebo zapnout automatické překlady stránek, generovaní popisného textu k obrázkům v otevřených PDF dokumentech, samoorganizaci tabů do skupin, náhledy odkazů s krátkým shrnutím a boční panel s chatbotem. Tyto možnosti v nastavení prohlížeče

    … více »
    NUKE GAZA! 🎆 | Komentářů: 8
    včera 14:44 | IT novinky

    Desktopové prostředí KDE Plasma 6.6, která je právě ve fázi beta, nahrazuje stávající SDDM novým Plasma Login Managerem, který je ale pevně navázán na systemd. Plasma Login Manager využívá systemd-logind a další součásti systemd, které nejsou dostupné v operačních systémech bez systemd, jako je například FreeBSD, případně jsou linuxové distribuce Gentoo, Void Linux anebo Alpine Linux. Pro uživatele zatím stále ještě existuje možnost používat SDDM.

    NUKE GAZA! 🎆 | Komentářů: 6
    včera 14:33 | Komunita

    Na webu komunitního setkání CSNOG 2026 jsou dostupné prezentace v PDF, jejich videozáznamy a fotografie z lednové akce ve Zlíně. CSNOG 2026 se zúčastnilo téměř 300 zájemců o vystoupení věnovaných správě sítí, legislativním a regulačním tématům nebo projektům z akademické sféry. Letos byly prezentace rozdělené do dvou treků, ve kterých se představilo 35 přednášejících. Setkání komunity CSNOG organizují společně sdružení CESNET, CZ.NIC a NIX.CZ.

    VSladek | Komentářů: 1
    včera 11:33 | IT novinky

    Americká vesmírná společnost SpaceX miliardáře Elona Muska koupila další Muskovu firmu xAI, která se zabývá vývojem umělé inteligence (AI). Informovala o tom na svém účtu na síti 𝕏. Musk tímto krokem propojí několik ze svých služeb, včetně chatbota s prvky umělé inteligence Grok, sociální sítě 𝕏 či satelitního internetového systému Starlink. Tržní hodnota společnosti SpaceX dosahuje jednoho bilionu dolarů (20,6 bilionu Kč), hodnota xAI pak činí 250 miliard dolarů.

    Ladislav Hagara | Komentářů: 3
    2.2. 23:22 | Bezpečnostní upozornění

    Byl odhalen supply chain attack na Notepad++: útočníci kompromitovali hosting Notepad++ a vybrané dotazy na aktualizace přesměrovávali na servery pod jejich kontrolou. Doporučuje se stáhnout instalátor a přeinstalovat.

    a1bert | Komentářů: 10
    Které desktopové prostředí na Linuxu používáte?
     (18%)
     (6%)
     (0%)
     (10%)
     (25%)
     (3%)
     (5%)
     (2%)
     (12%)
     (30%)
    Celkem 749 hlasů
     Komentářů: 25, poslední včera 19:50
    Rozcestník

    Servlety a kódování znaků

    17.5.2006 21:43 | Přečteno: 2435× | Java | poslední úprava: 18.5.2006 10:11

    Zatímco nastavení správného kódování souborů odesílaných webovým serverem do prohlížeče je už celkem zvládnutá věc, příjem textů z formulářů na webovém serveru může záludnostmi souvisejícími s kódováním ještě potrápit. Protože jsem při hledání jedné chyby na Abíčku zabrousil do hlubin zdrojových kódu Servlet API a servlet kontejneru Jetty, a nechci to za půl roku zkoumat znovu, popíšu (si) závěry výzkumu sem.

    Ani s vynálezem Unicode není problémům s různými kódováními znaků konec. Většinou už se s nimi nesetkávají běžní uživatelé, ale programátoři si jich stále ještě užijí dost a dost. Jedním z klasických problémů je komunikace přes HTTP.

    Každý slušný webový server, pokud posílá nějaký text, přidá do HTTP hlaviček informaci o jaký typ dat se jedná (např. HTML, čistý text) a také v jakém jsou kódování:

    HTTP/1.x 200 OK
    Date: Wed, 17 May 2006 18:24:59 GMT
    Server: Jetty/4.2.17
    Content-Type: text/html; charset=UTF-8
    

    Při odesílání dat z webového formuláře na server je ale situace horší. application/x-www-form-urlencoded nebo multipart/form-data , o použitém kódování ani čárka. Nějak mezi prohlížeči není zvykem tam informaci o kódování přidávat. Ona by nejspíš také spoustu serverů zmátla, a zbytek by s ní neuměl pracovat. A servery se tuto informaci zase nepokoušejí číst, protože ji prohlížeče neposílají. Začarovaný kruh.

    Naštěstí je mezi prohlížeči dobrým zvykem odesílat data zpět v kódování, v jakém ho přijala (resp. v kódování, které má na dané stránce uživatel zrovna nastavené, takže změní-li si uživatel z nějakého důvodu kódování stránky, pošlou se data v jiném kódování, než čekáte). Vynechám teď speciální případy, kdy mám v jednom projektu stránky v různých kódováních, nebo kdy bych chtěl odesílat data do formuláře, který nemám pod kontrolou (na cizí web) a musel bych se kódováním své stránky trefit do kódování cílového webu. I v jednoduchém případě, že odesílám formulář na svůj vlatní web, který má konzistení kódování znaků, pořád je tu problém: já jako autor aplikace vím, v jakém kódování mám stránky, a tedy v jakém kódování očekávat odpověď. Ale ta aplikace to neví.

    Konkrétně ve specifikaci Servlet API k tomu, aby se to aplikace dozvěděla, slouží metoda ServletRequest.setCharacterEncoding(String), doplněná do API od verze 2.3. Tím sdělíte Servlet API, v jakém kódování bude odpověď. (Jak jsem popsal výše, Servlet API nemá žádný způsob, jak kódování zjistit z HTTP požadavku. Spoléhá tedy na programátora, že dopředu ví, jaké to kódování bude. Ještě stále dokážou programátoři z pohledu počítačů magické věci – zde třeba věštit budoucnost.) Dobrým zvykem tedy je na začátku servletu (ještě před jakýmkoliv čtením z HTTP požadavku) zavolat tuto metodu se správným kódováním – a o zbytek už se není potřeba starat, Servlet API se postará o správné rozkódování parametrů dotazu a programátor v dalším kódu už jen může vrnět blahem nad tím, jak Java pěkně pracuje s řetězci, že String je prostě řetězec Unicode znaků a o nějaké kódování se nemusím starat, dockud nechci řetězec poslat zase někam ven.

    Pokud tuhle metodu programátor na začátku nezavolá, předpokládá servlet kontejner nějaké defaultní kódování – např. Jetty ve verzi 4.2.x předpokládalo kódování iso-8859-1, verze 5 a výš předpokládají UTF-8. Poměrně častý způsob zacházení s kódováním požadavku (a před přidáním metody ServletRequest.setCharacterEncoding(String) jediný možný) tedy bylo:

    Že tuhle rozcvičku text přežil ve zdraví je dáno shodou okolností: URLkódování kóduje oktety (osmibitové znaky) – kódování původního textu, který prohlížeč posílal, tedy vždy muselo pro svou reprezentaci používat oktety (ona se dnes snad ani jiná kódování nepoužívají, i UTF-16 ukládá do dvojic oktetů). A kódování iso-88592-1 plně pokrývá celý rozsah oktetů – jinými slovy, ať si zvolíte jakýkoli oktet, vždy to v iso-8859-1 znamená nějaký platný znak. U UTF-8 je situace horší, tam by zřejmě bylo možné vyrobit takovou sekvenci oktetů, které v UTF-8 neznamenají nic – tam už by tedy mohlo dojít ke ztrátě některých znaků nebo dokonce k chybě při překódování. Naštěstí u znakových sad iso-8859-2 a Windows-1250 se všechny běžné znaky vyjádřené v oktetech namapují na nějaké znaky UTF-8, takže ke ztrátě informace nedojde (alespoň jsem se s tím zatím nesetkal).

    Až dosud by to byla docela známá věc, a nebylo by potřeba nic zkoumat. Kdyby mi při testování nevracelo Servlet API tvrdošíjně řetězce překódované podle iso-8859-1 nezávisle na tom, jaké kódování jsem nastavil. (V situaci, kdy Jetty je spuštěné pod Windows a tedy kódovou stránkou windows-1250, konzole ve Windows zobrazuje v CP852, HTML stránky a tedy parametry jsou v iso-8859-2 a Servlet API si o tom myslí, že je to iso-8859-1, taky chvíli trvalo, než jsem zjistil, kde se to vlastně špatně překóduje…)

    Kamenem úrazu se zde stalo ono před jakýmkoli čtením požadavku. Debugování naustále ukazovalo, že parametry požadavku už někdo četl… Pochvíli byl jasný i pachatel: Filtr jakarta_compression (nejspíš součást Tomcatu), který komprimuje odpovědi gzipem, aby se po síti přenášelo míň dat. Tento filtřík s 60 řádky copyrightu a 200 řádky kódu se zcela nevinně dotazoval na parametr gzip. Sloužil mu k tomu, aby v případě, že je nastaven na false, data nekomprimoval. Taková drobná fíčurka usnadňující ladění… Tím pádem už někdo četl parametry, tedy četl požadavek, a tedy jakékoli snahy o změnu kódování vyšly naprázdno.

    Jak z toho ven? Napadají mne dvě možnosti: za prvé – pokaždé, když Servlet API získá informaci o změně kódování, zahodit nakešované parametry a načíst je znovu, tentokrát ve správném kódování (fuj). Taky by to zřejmě znamenalo pamatovat si celý požadavek po celou dobu zpracováníní… Druhá možnost: všem filtrům a veškerému zpracování požadavku předřadit ještě jeden filtr, který nastaví předpokládané kódování (dvakrát fuj). Všechny filtry mezi tím prvním nastavovacím a mým servletem budou už pracovat s nějakým kódováním, a nebudou o tom vědět. Navíc nastavení kódování parametrů, které potřebuji v Servletu, musím udělat úplně někde jinde, v nesouvisející části, a ještě nesmím zapomenout to všude přidat. Asi jako kdyby se už u zápisu do 1. třídy ptali, z jakých předmětů chci maturovat…

    Bohužel, nezbyde než použít metodu dvakrát fuj, protože jak mě upozornil Greg Wilkins, autor Jetty, specifikace k metodě ServletRequest.setCharacterEncoding(String) říká:

    Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader(). Otherwise, it has no effect.
    Tedy volně řečeno: dokud požadavek nikdo nečetl, lze měnit kódování libovolně, jakmile se někdo byť jen na písmenko podíval, je se změnami kódování utrum.

    A závěr? Příště už si nebudu myslet, že volání setCharacterEncoding na prvním řádku servletu je dostatečně brzo. Bez Filteru nastavujícího správné kódování už v Servlet webaplikacích ani ránu. Aneb

    public class EncodingFilter implements Filter{
      public void init(FilterConfig filterConfig) {
        this.encoding = filterConfig.getInitParameter("encoding");
      }
    
      public void doFilter ( ServletRequest request, ServletResponse response,
          FilterChain chain ) throws IOException, ServletException {
        request.setCharacterEncoding(this.encoding);
        chain.doFilter(request, response);
      }
    }
    
    do každé rodiny. A příležitostně pošťouchnout Mozillí Bugzillu, jestli by třeba nechtěl Firefox s formulářovými daty posílat i jejich kódování, pozeptat se ve fóru Servlet API, Apache a dalších, jestli by z takových údajů nechtěli informace o kódování získávat, a tak. A nebo doplnit křišťálovou kouli jako standardní výbavu webserverů…

    PS: A mimochodem – ta chyba na Abíčku nakonec byla úplně v něčem jiném. Věřili byste, že je možné přes chránku vložit do textového pole formuláře ve Firefoxu znaky jako Escape (kód 27)? A zřejmě občas někdo považoval za dobrý nápad takovéhle znaky vložit třeba do diskuze… Ale exkurze po zdrojácích Jetty z toho byla rozhodně zajímavá, vyzkoušet si vzdálené ladění Jetty s pomocí eclipse se také hodilo, a zase jsem o něco chytřejší… :-)

           

    Hodnocení: 100 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    18.5.2006 07:49 mivrap | blog: Mirkovo
    Rozbalit Rozbalit vše Re: Servlety a kódování znaků
    Zajímavé... Ovšem odstavec "Že tuhle rozcvičku..." mi přijde nějaký hóódně podezřelý. Napadla mě při tom otázka: Co máš vůbec za sebou v rámci počítačového vzdělávání? Gympl? Samouk?
    18.5.2006 10:00 Filip Jirsák | skóre: 67 | blog: Fa & Bi
    Rozbalit Rozbalit vše Re: Servlety a kódování znaků
    Co je na něm podezřelého? OK, UTF-16 nekóduje do 2 oktetů ale do 16 bitů, což je ale vzájemně triviálně převoditelné…

    Co já vím, jak je to s mým počítačovým vzděálním? Samouk, gympl jako student, učitel i správce sítě, přednášky na VŠ…
    Jiří Poláček avatar 18.5.2006 08:53 Jiří Poláček | skóre: 47 | blog: naopak | Sivice
    Rozbalit Rozbalit vše Re: Servlety a kódování znaků
    Před pár měsíci jsem se také s kódováním znaků z formulářů trápil. Řešení jsem našel na wiki Tomcatu.
    Sudoku omrzelo? Zkuste bobblemaze! | Statistiky jsou jak bikiny. Napoví hodně, všechno ale neukážou.
    18.5.2006 10:10 Filip Jirsák | skóre: 67 | blog: Fa & Bi
    Rozbalit Rozbalit vše Re: Servlety a kódování znaků
    No jo, jenže to první popsané řešení na té wiki je právě špatně :-( Za prvé, IE ani jiný prohlížeč neposílá data v iso-8859-1, ale v kódování, v jakém je stránka s formulářem. Je na to jednuduchý test – pokusit se odeslat text třeba s č, ř, š apod. – tyhle znaky není jak v iso-8859-1 zakódovat. Ale prohlížeč je zpravidla odešle :-) A za druhé se tam provádí ono dvojí překódování znaků, což nemusí dopadnout vždycky dobře. Navíc se tam předpokládá, že to první překódování bylo podle iso-8859-1, což taky nemusí být vždy pravda. To druhé řešení je správné, je tam dokonce i celý ten filtr i jeho použití, takže copy–&–paste toho filtru doporučuji z wiki Tomcatu :-)
    Jiří Poláček avatar 19.5.2006 09:17 Jiří Poláček | skóre: 47 | blog: naopak | Sivice
    Rozbalit Rozbalit vše Re: Servlety a kódování znaků
    Kdyby prohlížeče odesílaly data v kódování, v jakém je stránka s formulářem, tak bych s tím neměl žádné problémy a nehledal řešení ... Nevím, jestli v tom nemá prsty Tomcat, ale u mě se data posílají v iso-8859-1 bez ohledu na kódování stránky.
    Sudoku omrzelo? Zkuste bobblemaze! | Statistiky jsou jak bikiny. Napoví hodně, všechno ale neukážou.
    19.5.2006 09:54 Filip Jirsák | skóre: 67 | blog: Fa & Bi
    Rozbalit Rozbalit vše Re: Servlety a kódování znaků
    Důkazem, že prohlížeč neodesílá data v kódování iso-8859-1, je samotný váš komentář :-) V kódování iso-8859-1 nejsou znaky ř, ž, č – vám se je přes prohlížeč přesto podařilo odeslat… Jestli pod Tomcatem máte v servletu znaky rozkódované, jakoby byly iso-8859-1, ale stránka je v jiném kódování, je to přesně to, o čem byl můj spot – a nejjednodušší řešení je použít filtr popsaný na konci spotu nebo na vámi odkazované wiki Tomcatu.

    Mimochodem, pro ladění servletů doporučuji rozšíření do Firefoxu LiveHTTPheaders, tam můžete zjistit, v jakém kódování prohlížeč stránku dostává, jaká data odesílá atd.

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.