Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: ja 13. 07. 2014, 20:55:11

Název: Kódování souboru v Javě
Přispěvatel: ja 13. 07. 2014, 20:55:11
Ahoj, když uložím nějaké znaky do souboru pomocí třídy FileWriter, tak by se každý znak měl uložit jako 2 bajty (kvůli Javy, která používá UTF-16), ne ? Když tedy předchozí tvrzení bude platné, tak proč mi PSPad u souboru ukazuje kódování UTF-8 ?
Název: Re:Java, kódování souboru.
Přispěvatel: andy 13. 07. 2014, 20:59:24
Java pouziva nejake platform defaulty. getEncoding() ti co vrati? Pozeral si sa do dokumentacie?
Název: Re:Java, kódování souboru.
Přispěvatel: perceptron 13. 07. 2014, 20:59:58
javadoc filewritera
Citace
the constructors of this class assume that the default character encoding
takze na takom windowse zapisujete v cp1250

Název: Re:Java, kódování souboru.
Přispěvatel: ja 13. 07. 2014, 21:13:36
Java pouziva nejake platform defaulty. getEncoding() ti co vrati? Pozeral si sa do dokumentacie?

Ok, metoda mi vrátí UTF-8, zajímavé, myslel jsem si, že Java používá UTF-16 všude.
Mám ještě jednu otázku, když ukládám znaky pomocí bajtového streamu (např. FileOutputStream), jelikož se jedná o binární soubor, tak se žádné kódování textu nepoužívá, je to tak ?
Název: Re:Java, kódování souboru.
Přispěvatel: ja 13. 07. 2014, 21:29:18
Je to tak  :)
Název: Re:Java, kódování souboru.
Přispěvatel: perceptron 13. 07. 2014, 21:31:07
outputstream a kamarati umoznuju zapisovat bajty (alebo polia bajtov), to je o level nizsie nez nejake znaky/chary a ich kodovanie

java pouziva utf-16 len interne, pri zapise do suborov a pod sa pouziva platform encoding / default encoding, ktory zavisi na konkretnom OS/platforme: koniec koncov to dava zmysel, aby textaky na windowse boli vo windowsovskom kodovani
Název: Re:Java, kódování souboru.
Přispěvatel: Krysa1 13. 07. 2014, 21:37:34
Záleží na tom, co do toho streamu ukládáš. Pokud zapisuješ např byte array (byte[]), tak se logicky žádné kódování nepoužívá. Naopak, pokud zapisuješ String, tak se kódování používá. Java v ramce ukládá String v UTF-16, takže dojde ke konverzi do zvoleného kódování.


Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("test.txt"), "UTF-8"));
writer.write("+ěščřžýáíé");
Název: Re:Java, kódování souboru.
Přispěvatel: ja 13. 07. 2014, 22:31:07
Takže když budu ukládat znaky, které budou dat. typu char, tak se při uložení do bajtového streamu provede konverze na výchozí kódování, v mém případě UTF-8, chápu to dobře ?
Název: Re:Java, kódování souboru.
Přispěvatel: Krysa1 13. 07. 2014, 22:50:51
Ano, duvůd je ten, že neexistuje jednoznačný převod znaku do byte. Záleží jaké si nasadíme "brýle", neboli zvolíme kódování. Znak 'č' bude mít jinou binárni hodnotu(včetně délky) v UTF-8 a jinou v cp-1250.

Navíc nedoporučuju spoléhat na defaultní kódování systému, ale vždy si ho nastavit.
Název: Re:Java, kódování souboru.
Přispěvatel: Natix 14. 07. 2014, 00:49:04

Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("test.txt"), "UTF-8"));
writer.write("+ěščřžýáíé");


^ Toto
Název: Re:Kódování souboru v Javě
Přispěvatel: Filip Jirsák 14. 07. 2014, 10:29:51
Třídy java.io.FileReader a java.io.FileWriter by se (mimo nějakých prototypů) vůbec neměly používat, mají špatně navržené API. Používají kódování souborů, které se sebere bůhvíkde*), což je špatně – někde to pak magicky funguje (trefí se náhodou to kódování, které programátor chtěl), jinde se to pak zase magicky rozbíjí. Správně má programátor vždy znakovou sadu určit, a pokud chce použít znakovou sadu platformy, má to explicitně uvést. Takže je nutné používat kombinaci FileOutputStream+OutpuStreamWriter resp. FileInputStream+InputStreamReader.
java.io.OutputStreamWriter a java.io.InputStreamReader jsou na tom sice podobně, ale mají přetížené konstruktory, kde se znaková sada uvádí, takže tam je špatně vždy jen ten jeden konstruktor.

*) Ve skutečnosti je to voláním java.nio.charset.Charset#defaultCharset, ale není to napsané ani v dokumentaci těch tříd. Metoda defaultCharset() bere kódování ze systémové vlastnosti file.encoding, a pokud není nastavena, bere se výchozí kódování platformy – na unixech podle locale, na Windows znaková sada systému.
Název: Re:Kódování souboru v Javě
Přispěvatel: karel 14. 07. 2014, 19:06:31
tak ono by to mělo platit obecně, bez ohledu na jazyk, vždy uvádět znakovou sadu souboru, člověk se opravdu vyhne problémům  :P
Název: Re:Kódování souboru v Javě
Přispěvatel: Kit 14. 07. 2014, 19:38:47
tak ono by to mělo platit obecně, bez ohledu na jazyk, vždy uvádět znakovou sadu souboru, člověk se opravdu vyhne problémům  :P

K čemu pak jsou proměnné prostředí?

Pokud výstup chci v nějakém kódování (např. UTF-8 pro výstup v HTML), tak ho samozřejmě uvedu, ale pokud má jít výstup na terminál, tak by aplikace měla respektovat nastavení prostředí.
Název: Re:Kódování souboru v Javě
Přispěvatel: Filip Jirsák 14. 07. 2014, 19:50:51
tak ono by to mělo platit obecně, bez ohledu na jazyk, vždy uvádět znakovou sadu souboru, člověk se opravdu vyhne problémům  :P
Je dost smutné, že při komunikace přes internet se znaková sada a mime typ běžně uvádí (v HTTP hlavičkách, v hlavičkách e-mailu), ale na disku se to do metadat souborů neukládá, a každá aplikace to musí znovu a znovu hádat (přitom běžné souborové systémy metadata souborů podporují už dost dlouho). Pak existují taková zvěrstva jako v HTML a XML, kde se kódování textu souboru dozvíte někde veprostřed textu toho souboru. Zajímalo by mne, jak vypadá oficiální algoritmus pro detekci kódování těchto souborů.
Název: Re:Kódování souboru v Javě
Přispěvatel: Kit 14. 07. 2014, 20:06:16
tak ono by to mělo platit obecně, bez ohledu na jazyk, vždy uvádět znakovou sadu souboru, člověk se opravdu vyhne problémům  :P
Pak existují taková zvěrstva jako v HTML a XML, kde se kódování textu souboru dozvíte někde veprostřed textu toho souboru. Zajímalo by mne, jak vypadá oficiální algoritmus pro detekci kódování těchto souborů.

V XML je kódování uvedeno na prvním řádku. Pokud tam není, procesor se pokusí uhodnout, zda je tam UTF-8, UTF-16 nebo UTF-32. To jde poměrně snadno. Jiná kódování se nezkouší.
Název: Re:Kódování souboru v Javě
Přispěvatel: ja 14. 07. 2014, 20:27:41
Třídy java.io.FileReader a java.io.FileWriter by se (mimo nějakých prototypů) vůbec neměly používat, mají špatně navržené API. Používají kódování souborů, které se sebere bůhvíkde*), což je špatně – někde to pak magicky funguje (trefí se náhodou to kódování, které programátor chtěl), jinde se to pak zase magicky rozbíjí. Správně má programátor vždy znakovou sadu určit, a pokud chce použít znakovou sadu platformy, má to explicitně uvést. Takže je nutné používat kombinaci FileOutputStream+OutpuStreamWriter resp. FileInputStream+InputStreamReader.
java.io.OutputStreamWriter a java.io.InputStreamReader jsou na tom sice podobně, ale mají přetížené konstruktory, kde se znaková sada uvádí, takže tam je špatně vždy jen ten jeden konstruktor.

*) Ve skutečnosti je to voláním java.nio.charset.Charset#defaultCharset, ale není to napsané ani v dokumentaci těch tříd. Metoda defaultCharset() bere kódování ze systémové vlastnosti file.encoding, a pokud není nastavena, bere se výchozí kódování platformy – na unixech podle locale, na Windows znaková sada systému.

Existuje řešení přes reflexi:
Kód: [Vybrat]
System.setProperty("file.encoding","UTF-8");
Field charset = Charset.class.getDeclaredField("defaultCharset");
charset.setAccessible(true);
charset.set(null,null);

Našel jsem to na stackoverflow. Ale je pravda, že použití tříd InputStreamReader a OutputStreamWriter je lepší.
Název: Re:Kódování souboru v Javě
Přispěvatel: Filip Jirsák 14. 07. 2014, 20:38:22
Pak existují taková zvěrstva jako v HTML a XML, kde se kódování textu souboru dozvíte někde veprostřed textu toho souboru. Zajímalo by mne, jak vypadá oficiální algoritmus pro detekci kódování těchto souborů.
procesor se pokusí uhodnout
No právě. Myslel jsem, zda ten oficiální algoritmus obsahuje hádání, nebo zda existuje deterministický postup.
Název: Re:Kódování souboru v Javě
Přispěvatel: Kit 14. 07. 2014, 20:44:40
Pak existují taková zvěrstva jako v HTML a XML, kde se kódování textu souboru dozvíte někde veprostřed textu toho souboru. Zajímalo by mne, jak vypadá oficiální algoritmus pro detekci kódování těchto souborů.
procesor se pokusí uhodnout
No právě. Myslel jsem, zda ten oficiální algoritmus obsahuje hádání, nebo zda existuje deterministický postup.

Však jsem popsal deterministický postup. Musím zde uvádět kompletní algoritmus, abys to pochopil?
Název: Re:Kódování souboru v Javě
Přispěvatel: Filip Jirsák 14. 07. 2014, 21:22:53
Však jsem popsal deterministický postup. Musím zde uvádět kompletní algoritmus, abys to pochopil?
"Pokusí se uhodnout" nezní zrovna jako deterministický postup. A "jiná kódování se nezkoušejí" nevypadá jako dobrý postup, jak přečíst ten dokument v jiném kódování. 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. Když si vymyslím čtyřbajtové kódování, kde menšítko bude kódováno jako 3C 00 3F 00 atd., bude se to těžko odlišovat od UTF-16.
Název: Re:Kódování souboru v Javě
Přispěvatel: Kit 14. 07. 2014, 21:40:36
"Pokusí se uhodnout" nezní zrovna jako deterministický postup. A "jiná kódování se nezkoušejí" nevypadá jako dobrý postup, jak přečíst ten dokument v jiném kódování. 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. Když si vymyslím čtyřbajtové kódování, kde menšítko bude kódováno jako 3C 00 3F 00 atd., bude se to těžko odlišovat od UTF-16.

Dokumenty XML, které jsou v jiném kódování, mají povinnost toto kódování uvést v hlavičce. Jinak jsou odmítnuty nebo interpretovány chybně. První 4 byty pak stačí na rozlišení těch tří.
Název: Re:Kódování souboru v Javě
Přispěvatel: Filip Jirsák 15. 07. 2014, 06:49:52
Dokumenty XML, které jsou v jiném kódování, mají povinnost toto kódování uvést v hlavičce.
No právě. Jenže pro správné přečtení hlavičky je nutné znát to kódování.
Název: Re:Kódování souboru v Javě
Přispěvatel: Kit 15. 07. 2014, 07:30:24
Dokumenty XML, které jsou v jiném kódování, mají povinnost toto kódování uvést v hlavičce.
No právě. Jenže pro správné přečtení hlavičky je nutné znát to kódování.

V té hlavičce smí být jen znaky s ordinální hodnotou 0-127. UTF-16 a UTF-32 tam mají některé bajty nulové, UTF-8 a ostatní kódování jsou v tomto rozsahu totožné s ASCII.
Název: Re:Kódování souboru v Javě
Přispěvatel: Filip Jirsák 15. 07. 2014, 08:14:08
V té hlavičce smí být jen znaky s ordinální hodnotou 0-127.
Podle kterého standardu?
Název: Re:Kódování souboru v Javě
Přispěvatel: aaa 15. 07. 2014, 08:30:44
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".
Název: Re:Kódování souboru v Javě
Přispěvatel: Kit 15. 07. 2014, 08:33:29
V té hlavičce smí být jen znaky s ordinální hodnotou 0-127.
Podle kterého standardu?

http://www.w3.org/TR/xml/#sec-guessing-no-ext-info (http://www.w3.org/TR/xml/#sec-guessing-no-ext-info)
Název: Re:Kódování souboru v Javě
Přispěvatel: Kit 15. 07. 2014, 08:35:46
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".

Jen ho nechej. Třeba nemůže za to, že si to neumí vygooglit.
Název: Re:Kódování souboru v Javě
Přispěvatel: Filip Jirsák 15. 07. 2014, 09:16:56
http://www.w3.org/TR/xml/#sec-guessing-no-ext-info (http://www.w3.org/TR/xml/#sec-guessing-no-ext-info)
Ano, to je ten postup 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. Já vím, ono je to napsané až ve třetím odstavci odkazovaného textu, kdo by tak daleko dočetl, že… Takže stále platí, že opravdu univerzální řešení je jenom uvádět typ souboru a jeho kódování v metadatech mimo samotný obsah souboru.
Název: Re:Kódování souboru v Javě
Přispěvatel: Kit 15. 07. 2014, 09:39:35
http://www.w3.org/TR/xml/#sec-guessing-no-ext-info (http://www.w3.org/TR/xml/#sec-guessing-no-ext-info)
Ano, to je ten postup 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. Já vím, ono je to napsané až ve třetím odstavci odkazovaného textu, kdo by tak daleko dočetl, že… Takže stále platí, že opravdu univerzální řešení je jenom uvádět typ souboru a jeho kódování v metadatech mimo samotný obsah souboru.

Vždyť tam máš popsán postup i pro EBCDIC. Metadata pro XML skutečně nejsou potřebná. Které kódování tímto postupem neprojde?

Taky jsem mohl poslat odkaz bez kotvy, aby sis to mohl přečíst celé.
Název: Re:Kódování souboru v Javě
Přispěvatel: Kolemjdoucí 15. 07. 2014, 09:44:09
Takže stále platí, že opravdu univerzální řešení je jenom uvádět typ souboru a jeho kódování v metadatech mimo samotný obsah souboru.

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.
Název: Re:Kódování souboru v Javě
Přispěvatel: Filip Jirsák 15. 07. 2014, 10:31:25
Které kódování tímto postupem neprojde?
Třeba libovolné vícebajtové kódování jiné než UTF*/UCS*, nebo libovolné bajtové kódování, kde spodní polovina není shodná s ASCII. A dá se vymyslet i takové kódování, které bude procesor podle tohoto postupu považovat třeba za UTF-16, ale ve skutečnosti půjde o jiné kódování.

Taky jsem mohl poslat odkaz bez kotvy, aby sis to mohl přečíst celé.
Není potřeba, já jsem to celé četl už dávno a od té doby mnohokrát.

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?
Název: Re:Kódování souboru v Javě
Přispěvatel: Null 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.
Název: Re:Kódování souboru v Javě
Přispěvatel: podlesh 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é.
Název: Re:Kódování souboru v Javě
Přispěvatel: Kolemjdoucí 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.
Název: Re:Kódování souboru v Javě
Přispěvatel: Filip Jirsák 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.
Název: Re:Kódování souboru v Javě
Přispěvatel: aaa 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 :-)
Název: Re:Kódování souboru v Javě
Přispěvatel: podlesh 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.
Název: Re:Kódování souboru v Javě
Přispěvatel: NooN 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.
Název: Re:Kódování souboru v Javě
Přispěvatel: NooN 15. 07. 2014, 13:15:03
Samozrejme ak sa bavime o XML
Název: Re:Kódování souboru v Javě
Přispěvatel: Filip Jirsák 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 (http://www.w3.org/TR/xml/), 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.
Název: Re:Kódování souboru v Javě
Přispěvatel: Null 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?
Název: Re:Kódování souboru v Javě
Přispěvatel: Lol Phirae 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 (http://www.abclinuxu.cz/clanky/gimp-2.8-v-jednom-okne-a-s-celou-radou-vylepseni) to ještě stále je slabé. Přece jen, předvést takovou míru demence, že si to vyslouží  vlastní komiks (http://www.itbiz.cz/komiks/komiks-gimp-2-8), to je holt nepovede každý den.  ;D ;D ;D
Název: Re:Kódování souboru v Javě
Přispěvatel: Kit 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 (http://www.w3.org/TR/xml/), 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.
Název: Re:Kódování souboru v Javě
Přispěvatel: podlesh 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 (http://www.w3.org/TR/xml/), 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...
Název: Re:Kódování souboru v Javě
Přispěvatel: Filip Jirsák 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.
Název: Re:Kódování souboru v Javě
Přispěvatel: podlesh 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é.
Název: Re:Kódování souboru v Javě
Přispěvatel: ja 15. 07. 2014, 16:08:07
Takový spor :D  No tak, klid, za všechno můžou Babyloňané. ;)