Kódování souboru v Javě

Null

Re:Kódování souboru v Javě
« Odpověď #30 kdy: 15. 07. 2014, 10:49:23 »
Co mi brání sušit si hlavu v troubě? Co mi brání bít se do hlavy kladivem? Co mi brání pít Savo? Vůbec nic. Jen nevím, proč bych to dělal.


podlesh

Re:Kódování souboru v Javě
« Odpověď #31 kdy: 15. 07. 2014, 10:51:22 »
Jestliže si nedokážeš představit natož realizovat algoritmus na detekci zda je počáteční <?xml 1-2-4 byte a little-big endian, pak s tebou diskuze na toto téma opravdu nemá smysl.
Kde je definováno, že libovolné kódování musí být 1-, 2- nebo 4bajtové? Co mi brání vymyslet si 3- nebo 6bajtové? Co mi brání vymyslet si třeba dvoubajtové kódování, ve kterém se posloupnost tří znaků <?x zapíše jako 3C 3F 78 6D 6C 20?
Velmi jednoduchá a jasná odpověď: specifikace / standard.
XML standard striktně definuje a omezuje jaká kódování se smí použít. Pokud dodržíš standard, tak autodetekce bude fungovat. Pokud standard nedodržíš, tak to není XML ale něco jako JML (Jirsák Markup Language).

Ono obecně hlavní výhodou XML je právě to že má exaktní standard. Takže když mi nějaký chytrák z jiné firmy začne posílat nějakou lidovou tvořivost (ať už 3C 3F 78 6D 6C 20 nebo třeba "nebudu escapovat zobáček když je na konci řádku") tak nemusím blbnout a mohu si stát na svém, klidně to pak třeba hnát přes jeho nadřízené. Zatímco třeba u takového CSV aby si člověk psal pokaždé jiný parser, protože se dozvím že "my používáme v jednom sloupečku latin2 a v druhém latin1 a kvůli VÁM to přeci nebudeme předělávat" - zvláště korporace jsou docela neoblomné.

Kolemjdoucí

Re:Kódování souboru v Javě
« Odpověď #32 kdy: 15. 07. 2014, 11:56:25 »
Co mi brání vymyslet si 3- nebo 6bajtové?

Brání tomu konvence, normy a specifikace, u XML jednoduše akceptujeme asi sedm možností, ostatní se buď přizpůsobí nebo zemřou.

Re:Kódování souboru v Javě
« Odpověď #33 kdy: 15. 07. 2014, 12:08:15 »
Velmi jednoduchá a jasná odpověď: specifikace / standard.
XML standard striktně definuje a omezuje jaká kódování se smí použít. Pokud dodržíš standard, tak autodetekce bude fungovat.
Kde to ten standard definuje?

Although an XML processor is required to read only entities in the UTF-8 and UTF-16 encodings, it is recognized that other encodings are used around the world, and it may be desired for XML processors to read entities that use them. In the absence of external character encoding information (such as MIME headers), parsed entities which are stored in an encoding other than UTF-8 or UTF-16 must begin with a text declaration (see 4.3.1 The Text Declaration) containing an encoding declaration:

In an encoding declaration, the values " UTF-8 ", " UTF-16 ", " ISO-10646-UCS-2 ", and " ISO-10646-UCS-4 " should be used for the various encodings and transformations of Unicode / ISO/IEC 10646, the values " ISO-8859-1 ", " ISO-8859-2 ", ... " ISO-8859- n " (where n is the part number) should be used for the parts of ISO 8859, and the values " ISO-2022-JP ", " Shift_JIS ", and " EUC-JP " should be used for the various encoded forms of JIS X-0208-1997. It is recommended that character encodings registered (as charsets) with the Internet Assigned Numbers Authority [IANA-CHARSETS], other than those just listed, be referred to using their registered names; other encodings should use names starting with an "x-" prefix. XML processors should match character encoding names in a case-insensitive way and should either interpret an IANA-registered name as the encoding registered at IANA for that name or treat it as unknown (processors are, of course, not required to support all IANA-registered encodings).

Když si nadefinuju vlastní kódování „BLABLA“ a budu mít soubor, který bude mít na začátku hlavičku s následující sekvencí znaků (zapsanou samozřejmě v „BLABLA“ kódování), kterou část standardu ten soubor porušuje?
<?xml encoding='x-BLABLA'?>

Co mi brání vymyslet si 3- nebo 6bajtové?

Brání tomu konvence, normy a specifikace, u XML jednoduše akceptujeme asi sedm možností, ostatní se buď přizpůsobí nebo zemřou.
Ono to v praxi funguje, protože se reálně těch kódování moc nepoužívá, ale univerzální postup použitelný pro jakoukoli sadu kódování neexistuje.

aaa

Re:Kódování souboru v Javě
« Odpověď #34 kdy: 15. 07. 2014, 12:47:42 »
Este raz:
> Velmi jednoduchá a jasná odpověď: specifikace / standard.

Takze ak vymyslis kodovanie BLABLA, tak ho bud nechaj standardizovat, alebo si napis vlastny XML parser.
Inu moznost nevidim :-)


podlesh

Re:Kódování souboru v Javě
« Odpověď #35 kdy: 15. 07. 2014, 13:09:44 »
Velmi jednoduchá a jasná odpověď: specifikace / standard.
XML standard striktně definuje a omezuje jaká kódování se smí použít. Pokud dodržíš standard, tak autodetekce bude fungovat.
Kde to ten standard definuje?
No dobře, uznávám že standard jasně říká že pokud je k dispozici externí informace o kódování (tj. ona metadata), tak se může udělat fakt opravdu libovolné. Takže vzhledem k původní debatě platí, že metadata na FS by to řešila bez problémů.

Když si nadefinuju vlastní kódování „BLABLA“ a budu mít soubor, který bude mít na začátku hlavičku s následující sekvencí znaků (zapsanou samozřejmě v „BLABLA“ kódování), kterou část standardu ten soubor porušuje?
<?xml encoding='x-BLABLA'?>
Žádnou. Pokud všechny znaky v této sekvenci mají stejné kódování jako v ASCII, tak je všechno v pořádku, metadata jsou korektně zakódována přímo uvnitř souboru a není potřeba mít žádná out-of-band data.

NooN

Re:Kódování souboru v Javě
« Odpověď #36 kdy: 15. 07. 2014, 13:11:23 »
Citace
Když si nadefinuju vlastní kódování „BLABLA“ a budu mít soubor, který bude mít na začátku hlavičku s následující sekvencí znaků (zapsanou samozřejmě v „BLABLA“ kódování), kterou část standardu ten soubor porušuje?
<?xml encoding='x-BLABLA'?>
Dokazes pochopit len tu jednu jedinu vec, kde sa pise o hlavicke?
Citace
V té hlavičce smí být jen znaky s ordinální hodnotou 0-127
To je ten standart.

NooN

Re:Kódování souboru v Javě
« Odpověď #37 kdy: 15. 07. 2014, 13:15:03 »
Samozrejme ak sa bavime o XML

Re:Kódování souboru v Javě
« Odpověď #38 kdy: 15. 07. 2014, 13:41:57 »
No dobře, uznávám že standard jasně říká že pokud je k dispozici externí informace o kódování (tj. ona metadata), tak se může udělat fakt opravdu libovolné.
Nebylo by jednodušší, než si to vymýšlet, přečíst si příslušnou část standardu, kterou jsem v předchozím komentáři citoval? Tam je jasně napsáno, že pokud externí informace k dispozici není a není použito kódování UTF-8 nebo UTF-16, musí být kódování vždy uvedeno v hlavičce.

Žádnou. Pokud všechny znaky v této sekvenci mají stejné kódování jako v ASCII, tak je všechno v pořádku, metadata jsou korektně zakódována přímo uvnitř souboru a není potřeba mít žádná out-of-band data.
A pokud znaky v této sekvenci nemají stejné kódování, jako v ASCII, je podle standardu také všechno v pořádku, akorát parser musí zkusit uhodnout další kódování. A když bude to moje kódování vhodně vytvořené, tak ho nedokáže odlišit od kódování třeba UTF-8.

Dokazes pochopit len tu jednu jedinu vec, kde sa pise o hlavicke?
Ano. Chápu jí, dokonce jsem jí tu citoval, aby to ostatní nemuseli hledat, a pak jsem popsal příklad, který neodporuje ničemu ze standardu, přesto parser nedokáže kódování určit, i když to kódování bude umět.

Citace
V té hlavičce smí být jen znaky s ordinální hodnotou 0-127
To je ten standart.
Vím, že se budu opakovat, ale kde to v tom standardu je uvedené? Standard není něco, co vy jen tak prohlásíte. XML je definováno tímto standardem, takže odpověď na otázku „kde to ve standardu je“ by měla označit nějakou část tohoto dokumentu, nebo dokumentu z něj odkazovaného. Případně tu část můžete zkopírovat a vložit sem.

Null

Re:Kódování souboru v Javě
« Odpověď #39 kdy: 15. 07. 2014, 13:52:11 »
Citace
Tam je jasně napsáno, že pokud externí informace k dispozici není a není použito kódování UTF-8 nebo UTF-16, musí být kódování vždy uvedeno v hlavičce.

Tak to svoje magické kódování nedávejte do hlavičky, ale uveďte ho externě. Nějaký další problém?

Lol Phirae

Re:Kódování souboru v Javě
« Odpověď #40 kdy: 15. 07. 2014, 14:05:04 »
Jirsák: Jsi zřejmě jediný, kdo s tím má nějaký problém. Diskuze s tebou mi silně připomínají soudruha Laela a jeho motto "Budu mít poslední slovo, i kdyby hovna padaly".

Aktuálně perlí mj. např. na Lupě (datové/daňové schránky). Ale jinak oproti jeho legendárnímu threadu na abclinuxu.cz na téma Export z GIMPu to ještě stále je slabé. Přece jen, předvést takovou míru demence, že si to vyslouží  vlastní komiks, to je holt nepovede každý den.  ;D ;D ;D

Kit

Re:Kódování souboru v Javě
« Odpověď #41 kdy: 15. 07. 2014, 14:23:35 »
Citace
V té hlavičce smí být jen znaky s ordinální hodnotou 0-127
Vím, že se budu opakovat, ale kde to v tom standardu je uvedené? Standard není něco, co vy jen tak prohlásíte. XML je definováno tímto standardem, takže odpověď na otázku „kde to ve standardu je“ by měla označit nějakou část tohoto dokumentu, nebo dokumentu z něj odkazovaného. Případně tu část můžete zkopírovat a vložit sem.

Because the contents of the encoding declaration are restricted to characters from the ASCII repertoire (however encoded), a processor can reliably read the entire encoding declaration as soon as it has detected which family of encodings is in use.

Je to přesně v té části vymezené kotvou. Tak si to koukej přečíst. A kdyby ti to nedošlo, tak ASCII je vymezeno ordinálními hodnotami 0..127 a je podmnožinou UTF-8.

podlesh

Re:Kódování souboru v Javě
« Odpověď #42 kdy: 15. 07. 2014, 14:46:11 »
No dobře, uznávám že standard jasně říká že pokud je k dispozici externí informace o kódování (tj. ona metadata), tak se může udělat fakt opravdu libovolné.
Nebylo by jednodušší, než si to vymýšlet, přečíst si příslušnou část standardu, kterou jsem v předchozím komentáři citoval? Tam je jasně napsáno, že pokud externí informace k dispozici není a není použito kódování UTF-8 nebo UTF-16, musí být kódování vždy uvedeno v hlavičce.
A ještě jednodušší by bylo nehádat se o věcech, které nejsou rozporovány. Tohle všichni vidí a všichni s tím souhlasí (no, alespoň já určitě).

Žádnou. Pokud všechny znaky v této sekvenci mají stejné kódování jako v ASCII, tak je všechno v pořádku, metadata jsou korektně zakódována přímo uvnitř souboru a není potřeba mít žádná out-of-band data.
A pokud znaky v této sekvenci nemají stejné kódování, jako v ASCII, je podle standardu také všechno v pořádku, akorát parser musí zkusit uhodnout další kódování.
Ne, žádné další kódování nebude hádat, proč by to dělal? Hlavička je úspěšně načtena a je v ní uvedeno kódování BLABLA. Pravděpodobně pak parser skončí s chybou že takové kódování neumí, ale to je úplně jiný problém než že by nevěděl jaké kódování tam je. To ví naprosto přesně a jednoznačně.

Zajímavé je, že nikdo z autorů XML parserů s tímto neměl nikdy problém (tedy až na Microsoft UTF-8 BOM, ale tam šlo evidentně o záměrné kurvítko). Nejspíš asi z toho důvodu, že obdobný systém se v protokolech používá desítky let před XML.

Vím, že se budu opakovat, ale kde to v tom standardu je uvedené? Standard není něco, co vy jen tak prohlásíte. XML je definováno tímto standardem, takže odpověď na otázku „kde to ve standardu je“ by měla označit nějakou část tohoto dokumentu, nebo dokumentu z něj odkazovaného. Případně tu část můžete zkopírovat a vložit sem.
Není potřeba, už jsi to zkopíroval a vložil.
Teď už se diskuse točí jen kolem toho, co že se ti to vlastne přesně nelíbí - chvíli je to že se kódování nedá zdetekovat i když je v hlavičce, chvíli to vypadá že ti vadí že to tam v té hlavičce musí být, jindy prostě ani netuším...

Re:Kódování souboru v Javě
« Odpověď #43 kdy: 15. 07. 2014, 15:00:24 »
Because the contents of the encoding declaration are restricted to characters from the ASCII repertoire (however encoded), a processor can reliably read the entire encoding declaration as soon as it has detected which family of encodings is in use.
Nepletete vy si znaky a bajty?
Mám kódování, kde se znak < (hodnota 60) zapisuje jako dvojice oktetů 3C 3F, znak ? (hodnota 63) jako dvojice oktetů 78 6D, znak x (hodnota 120) jako dvojice oktetů 6C 20 atd. Standard je splněn, znaky <, ? i x jsou znaky z ASCII, i celá deklarace kódování jsou jen znaky z ASCII, protože pevné části deklarace jsou znaky z ASCII a název kódování jsou také znaky z ASCII.
Akorát je tu pořád ten problém, že existují kódování, která znaky ASCII (ani z její dolní poloviny) nekódují do oktetů stejně, jako kódování ASCII. Příkladem takových kódování jsou UTF-16 nebo UCS-4.

Ne, žádné další kódování nebude hádat, proč by to dělal? Hlavička je úspěšně načtena a je v ní uvedeno kódování BLABLA.
A jak se to podařilo tu hlavičku načíst, když k jejímu správnému přečtení je potřeba vědět, že je v kódování BLABLA? A když to nevíte a pokusíte se to přečíst jako ASCII, dostanete jiný text?

Zajímavé je, že nikdo z autorů XML parserů s tímto neměl nikdy problém
Ano, protože parsery řeší pár vybraných kódování. Ale standard, který připouští libovolné kódování, pokud je černé, je trochu divný.

Není potřeba, už jsi to zkopíroval a vložil.
Já jsem vkládal pouze části, které se týkají zpracování znaků. V souborech jsou ovšem bajty (oktety), které je potřeba na znaky převést. Jak se mají převést, to určuje právě kódování. Jenže abych se dozvěděl kódování, musím nejprve přečíst text – ve správném kódování. Dnešní parsery to dělají tak, že zkusí tipnout varianty UCS-2 a UCS-4, pokud to nevychází, mohou tipnout ještě EBCDIC, a pokud ani to nevyjde, předpokládají, že jde o kódování, které znaky 0–127 kóduje stejně, jako ASCII. Takže když narazí na kódování, které tyhle znaky kóduje jinak, nedopadne to dobře – v lepším případě parser skončí chybou kvůli neočekávaným znakům, v horším případě ty oktety budou dávat smysl i pokud budou čtené jako ASCII, a parser načte něco úplně jiného, než v souboru je ve skutečnosti.

podlesh

Re:Kódování souboru v Javě
« Odpověď #44 kdy: 15. 07. 2014, 15:15:07 »
Zajímavé je, že nikdo z autorů XML parserů s tímto neměl nikdy problém
Ano, protože parsery řeší pár vybraných kódování. Ale standard, který připouští libovolné kódování, pokud je černé, je trochu divný.
Pojem divný je natolik individuální, že se to nedá popřít. Ještě by možná by se dalo říci omezující. Ale není to nic neobvyklého a je to naopak velmi praktické.