Niejawna konwersja kodowania ISO-8859-1 na UTF-8

0

Hej.

Nie rozumiem zbytnio działania jednej rzeczy: Mój kod odczytuje plik zapisany w kodowaniu ISO-8859-1 odczytuje pierwszą linię, która zawiera znak specjalny. Potem zapisuje ten naps do pliku wyjściowego już używająć kodowania utf-8. Nie rozumiem dlaczego zostało to wykonane poprawnie? String line jest w zupełnie innym kodowaniu i ja zapisuje go do pliku, a konwersja została przeprowadzona i nie wiem w którym momencie.

@SneakyThrows
public static void main(String[] args) {
    File file = new File("C:\\Users\\creat\\Desktop\\PI\\test");
    FileInputStream fileInputStream = new FileInputStream(file);
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream, StandardCharsets.ISO_8859_1));
    String line = bufferedReader.readLine();

    File file2 = new File("C:\\Users\\creat\\Desktop\\PI\\testResult");
    BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file2));
    bufferedWriter.write(line);
    bufferedWriter.close();
}
1

to że zdefiniowałeś input stream jako iso-8859_1 oznacza tylko tyle że czytasz w takim formacie - i to jest ok.
Żeby wypisywał w tym samym, a nie system default musisz też zdefiniować kodowanie dla output streama.

String line nie jest w iso-8850_1 ;-) poczytaj o tym jak java przechowuje i przetwarza stringi.

0

Java przechowuje unicode dla formatu zależnie od systemu, w moim przypadku jest to utf-8. Czyli w momencie tworzenia klasy String jest dokonywana konwersja z tego co wyznaczyłem przy input stream, na ten domyślny w moim przypadku utf-8?

1

tak, wewnętrznie stringi zawsze masz przetrzymywane w unikodzie.
Dlatego jak chcesz zrobić konwersję no iso-latin-1 na utf-8 to wystarczy wczytać do stringa używając charsetu iso-latin-1 i wypisać używając charsetu utf8 (lub żadnego jeżeli taki masz ustawiony domyślny).

1
Tomek112271 napisał(a):

Nie rozumiem dlaczego zostało to wykonane poprawnie? String line jest w zupełnie innym kodowaniu i ja zapisuje go do pliku, a konwersja została przeprowadzona i nie wiem w którym momencie.

przybysze z innych platfom, np z Delphi maja problem w Javie, myślą że muszą jakieś specjalne modły robić aby zapamiętać "to w jakim kodowaniu właścwie mam ten string"
No własnie wcale.
Wewnętrzny format Stringa jest zestandaryzowany, w wszelkie określenia strony kodowej dotyczą tylko krótkich momentów wejścia lub wyjśća. Jest to bardzo zdrowa polityka. Np czytamy plik z archaicznej Mazovii z jakiegoś 30 letniego systemu (tabele kodowe mazovii da sie zintegrowac z ekosystemem Javy), i zapominamy o tym, żyje to od tej pory tak, jak każdy innych String.

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