Wykrywanie kodowania plików, strona kodowa

Wykrywanie kodowania plików, strona kodowa
LO
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 4 lata
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 :

Kopiuj
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 :

Kopiuj
 
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));
  } 

airborn
  • Rejestracja:ponad 15 lat
  • Ostatnio:prawie 7 lat
  • Postów:274
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).

LO
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 4 lata
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.

LO
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 4 lata
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.

ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 19 godzin
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.


LO
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 4 lata
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)

edytowany 1x, ostatnio: LOSMARCELOS
Q4
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:103
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.

edytowany 1x, ostatnio: qwertty43
LO
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 4 lata
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?

LO
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 4 lata
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ć.

Q4
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:103
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.

LO
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 4 lata
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.

Q4
Mućka, nie trzeba znać kodowania pierwotnego. Właśnie do tego służy base64, najpierw encode, później decode i masz z powrotem plik wejściowy. Nie będę jednak zgrywał wszystkowiedzącego w tym temacie :), nie jest to moją mocną stroną.
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?

ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 19 godzin
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.


edytowany 1x, ostatnio: ŁF
LO
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 4 lata
0

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

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)