Wykrywanie kodowania plików, strona kodowa

0

Hej! Mam pewien problem z wykryciem kodowania plików... O ile jeśli plik tekstowy jest zapisany w UTF-8, zrobię w nim pewne zmiany, zapiszę też jako UTF-8 to nie ma problemów. Natomiast jeśli plik zapisany w stronie kodowej windows-1250 to już jest problem przy odczytaniu i zapisaniu go ponownym (w UTF-8). Przy konwersji są krzaki. Owszem, można zapisać plik wyjściowy jako windows-1250 (a więc taki sam jak plik wejściowy), ale problem pojawia się przy wykrywaniu strony kodowej pliku...
Używam takiego kodu :

public static String odczytajKodowaniePliku(String nazwaPliku)
{
    String kodowanieZnakowWPliku = "";
    try
    {
        FileInputStream fis = new FileInputStream(nazwaPliku);
        InputStreamReader isr = new InputStreamReader(fis);
        kodowanieZnakowWPliku = isr.getEncoding();
        isr.close();
    }
    catch (IOException ioe)
    {
        JOptionPane.showMessageDialog(null, ioe.toString(), "Błąd", JOptionPane.ERROR_MESSAGE);
    }
    return kodowanieZnakowWPliku;
}
 

Być może coś jest źle... zawsze jako UTF8 dekoduje...

np kod odczytujący plik w formacie windows-1250 działa ok, tylko chodzi mi o samo wykrywanie strony kodowej :

 
public static void readLargerTextFile(String aFileName)
{

    Path path = Paths.get(aFileName);
    try 
    {
        Scanner scanner =  new Scanner(path, "windows-1250");
      while (scanner.hasNextLine()){
        log(scanner.nextLine());
      }

    }
    catch (IOException ioe)
      {
          
      }
  } 

   private static void log(Object aMsg){
    System.out.println(String.valueOf(aMsg));
  } 

0

Domyślny konstruktor w InputStreamReader nie działa tak, że wykrywa automatycznie stronę kodową, tylko tak, że używa domyślnej strony kodowej (UTF-8).

0

Hmmm... no właśnie, ehhh tylko gorzej jak jest plik w innym standardzie niż UTF-8.
Da się jakoś wykryć kodowanie pliku bez podłączania bibliotek zewnętrznych?
Owszem, przy zapisie pliku łatwo da się zmienić kodowanie, ale chodzi o to, żeby program sam wykrywał kodowanie pliku wejściowego....

0

Domyslnie nie jest UTF-8, a przynajmniej nie zawsze. U mnie (linux) owszem, na innych OSach jest jakies cp1252 lub 1250 (zalezy gdzie kraj / komputer lezy / jakie ma ustawienia). Moze nowe windowsy maja domyslnie utf8, te starsze raczej nie...
Odkrywanie kodowania nie jest latwym zadaniem, i nie jest rowniez 100% niezawodne. Do tego jest pare bibliotek (np. mozilla cos napisala, jest chardet do pythona i pewnie mnostwo innych), java w standardzie tego nie ma, i jest to prawie na pewno zla droga.

Jesli plik jest zapisany w jakims kodowaniu ktore znasz - przy wczytaniu do pamieci caly tekst zostanie zamieniony na string (zdaje sie big-endian utf16 bez bom) i bedzie ok, i zapisanie z konkretnych kodowaniem (obojetnie jakim) zapisze dobrze. Aby miec pewnosc musisz jednak przy tworzeniu readera i writera podawac kodowania jakich ma uzyc.

0

System operacyjny jakiego używam to jest Windows 7 HE, natomiast środowisko programistyczne to Netbeans 7.3, Java 7 (update 17)...
Hmmmm, czyli to nie będzie takie proste? Owszem, zapis pliku i ręczne wybranie typu kodowania (podobnie jak odczyt) jest ok, gorzej z wykryciem kodowania w pliku. Niby program prosty, ale jeden aspekt go komplikuje...
Może użyć biblioteki :ICU (http://site.icu-project.org/) dla Javy : http://site.icu-project.org/download/51#TOC-ICU4J-Download
Ewentualnie da się jakoś bez względu na to w jakim formacie będzie wczytany plik tekstowy "na siłę, poprawnie" go przekonwertować do UTF-8 ?

0

Nie da sie na sile konwertowac nie znajac kodowania wejsciowego. Taka konwersja polega na wczytaniu pliku i ponownym zapisaniu, czyli musisz wczytac, czyli musisz znac kodowanie...
Jestes pewien ze wymaganie jest takie ze musisz sam odkrywac kodowanie? A moze mozesz zapisac do tego pliku dodatkowe info? Np. pierwsza linijka zawiera kodowanie? Albo w nazwie pliku masz kodowanie (wiem, zawodne ale moze?)? Czy ten program ma wczytywac pliki tworzone przez zwykle notatniki czy tylko swoje? Itp. itd.

1

google... http://jchardet.sourceforge.net/
rozbraja mnie ile problemów można rozwiązać w pięć sekund po wpisaniu tematu wątku w oryginale lub po angielsku do google.

0

Ooo dzięki :) Program odczytuje pliki tworzone np. przez notatnika :)
Faktycznie, przeglądałem tą stronę Mozilli ale jakoś mi to ostatecznie umknęło uwadze. To chyba będzie dobra biblioteka, bo znalazłem jeszcze inną... (ICU)

0

Odpowiedź jest prosta: nie ma sposobu na 100% pewne wykrycie kodowania pliku. ŁF podał link do biblioteki, która jest do tego polecana, niestety jest ona zawodna i w wielu przypadkach nie daje sobie rady.'
Więc niestety albo będziesz musiał znać kodowanie z góry, albo możesz konwertować pliki do formatu base64 (albo jakiegoś ekwiwalentu) i wtedy poddawać je jakiejś obróbce.

0

Ehhh kurcze...
A ta biblioteka?
http://site.icu-project.org/download/51#TOC-ICU4J-Download
? Ktoś może próbował?

0
ŁF napisał(a):

google... http://jchardet.sourceforge.net/
rozbraja mnie ile problemów można rozwiązać w pięć sekund po wpisaniu tematu wątku w oryginale lub po angielsku do google.

Po pierwsze primo: i chardet (dla pythona) i jakies mozillowate cos bylo wczesniej wspomniane.
Po drugie primo: to sa zawodne metody, nie wiem czy korzystales z tych bibliotek.
Nie zgrywaj takiego gieroja.

0
qwertty43 napisał(a):

Odpowiedź jest prosta: nie ma sposobu na 100% pewne wykrycie kodowania pliku. ŁF podał link do biblioteki, która jest do tego polecana, niestety jest ona zawodna i w wielu przypadkach nie daje sobie rady.'
Więc niestety albo będziesz musiał znać kodowanie z góry, albo możesz konwertować pliki do formatu base64 (albo jakiegoś ekwiwalentu) i wtedy poddawać je jakiejś obróbce.

A co ma tutaj base64 do rzeczy?

0

Spokojnie :) Nie jestem jakimś specem od Javy.
Wymyśliłem jeszcze inną metodę... W sumie można wykrywać wersje systemu operacyjnego (windows, linux, mac, solaris) i język i na tej podstawie w comboboxie zasugerować użytkownikowi format kodowania pliku... Np. jeśli będzie Windows i język PL to wtedy "windows-1250" w combobox się ustawi. Jeśli będą krzaki to użytkownik może spróbować UTF-8 albo co innego... wybrać.

0

Base64 do rzeczy może mieć to, że możemy każdy plik binarny (lub nie) bez znajomości kodowania przetworzyć na format bezpieczny do "zabawy". Wiem co mówię, bo kiedyś sam siedziałem wiele godzin nad tym problemem i praktycznie nie ma biblioteki, która wykryje w każdym przypadku poprawne kodowanie.

0

To mam pytanie : w jakim domyślnie formacie (stronie kodowej) zapisywane są pliki w Linux (np Ubuntu) ? (ISO-8859-2, windows-1250, UTF-8) ?
Dla Macintosha i plików zapisywanych przez tamtejsze programy to : x-MacCentralEurope ? (chodzi o język polski)

0
qwertty43 napisał(a):

Base64 do rzeczy może mieć to, że możemy każdy plik binarny (lub nie) bez znajomości kodowania przetworzyć na format bezpieczny do "zabawy". Wiem co mówię, bo kiedyś sam siedziałem wiele godzin nad tym problemem i praktycznie nie ma biblioteki, która wykryje w każdym przypadku poprawne kodowanie.

Wytlumacz mi prosze jak chcesz jakis tekst cakodowany w base64, nie znajac kodowania tekstu pierwotnego (co jest bez znaczenia) chcesz zapisac np. w utf8. Mowie o zapisaniu tekstu, a nie base64.encode(tekst). Pytam powaznie, moze sie naucze czegos nowego.

0
LOSMARCELOS napisał(a):

To mam pytanie : w jakim domyślnie formacie (stronie kodowej) zapisywane są pliki w Linux (np Ubuntu) ? (ISO-8859-2, windows-1250, UTF-8) ?
Dla Macintosha i plików zapisywanych przez tamtejsze programy to : x-MacCentralEurope ? (chodzi o język polski)

Najlatwiej takie cos na danej maszynie pobrac w ten sposob:
System.getProperty("file.encoding");
U mnie (ubuntu) jest utf8. Problem moze powstac jak ktos uruchomi taki program ze swotchem -Dfile.encoding=dupa... Inny problem to gdy pliki przenoszone sa miedzy OSami - zapisane na linuksie a czytane na win czy odwrotnie. Jak juz wspomniano wielokrotnie, nie ma idealnego sposobu na rozwiazanie tego problemu gdy nie zna sie kodowania. Jak powiedzial Joel Spolsky (a moze on tylko powtarza) w artykule http://www.joelonsoftware.com/articles/Unicode.html: There Ain't No Such Thing As Plain Text. Musisz znac kodowanie i tyle.

0
ŁF napisał(a):

google... http://jchardet.sourceforge.net/
rozbraja mnie ile problemów można rozwiązać w pięć sekund po wpisaniu tematu wątku w oryginale lub po angielsku do google.

Swoja droga moderator, a nie czyta watkow w ktorych sie wypowiada:

LOSMARCELOS napisał(a):

Da się jakoś wykryć kodowanie pliku bez podłączania bibliotek zewnętrznych?

0

Wyobraź sobie, że przeczytałem na tyle, żeby wiedzieć, że bez wyważania otwartych drzwi nie da się. Doczytałem nawet do miejsca, gdzie autor sam znalazł jakąś wszystkoposiadajacą bibliotekę. O dziwo, zewnętrzną. Twoją wypowiedź przegapiłem, za co przepraszam.

0

Ktoś testował może, którąś z bibliotek?
Na razie zrobiłem tak, że użytkownik może wybrać kodowanie pliku z comboboxa...

1 użytkowników online, w tym zalogowanych: 0, gości: 1