Kódování souboru v Javě

ja

Re:Kódování souboru v Javě
« Odpověď #15 kdy: 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ší.


Re:Kódování souboru v Javě
« Odpověď #16 kdy: 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.

Kit

Re:Kódování souboru v Javě
« Odpověď #17 kdy: 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?

Re:Kódování souboru v Javě
« Odpověď #18 kdy: 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.

Kit

Re:Kódování souboru v Javě
« Odpověď #19 kdy: 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ří.


Re:Kódování souboru v Javě
« Odpověď #20 kdy: 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í.

Kit

Re:Kódování souboru v Javě
« Odpověď #21 kdy: 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.

Re:Kódování souboru v Javě
« Odpověď #22 kdy: 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?

aaa

Re:Kódování souboru v Javě
« Odpověď #23 kdy: 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".

Kit

Re:Kódování souboru v Javě
« Odpověď #24 kdy: 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

Kit

Re:Kódování souboru v Javě
« Odpověď #25 kdy: 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.

Re:Kódování souboru v Javě
« Odpověď #26 kdy: 15. 07. 2014, 09:16:56 »
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.

Kit

Re:Kódování souboru v Javě
« Odpověď #27 kdy: 15. 07. 2014, 09:39:35 »
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é.

Kolemjdoucí

Re:Kódování souboru v Javě
« Odpověď #28 kdy: 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.

Re:Kódování souboru v Javě
« Odpověď #29 kdy: 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?