Polskie znaki w pliku i konsoli po konwersji z integer

0

Witam.
Przeszukałem troche to forum jednak odpowiedzi nie znalazłem. Mam nadzieje, że nie powtarzam pytania.

Do rzeczy:
wczytuję znaki z pliku i konwertuję je do int metodą
dataInputStream.readUnsignedByte();
Potem coś tam z tymi intami robię, zapisuję je w pliku i ponownie odczytuję. Czyli mam int będący numerem w rozszerzonej tablicy ASCII (polski znak - powyżej 127) i chcę go zamienić na char. I tutaj pojawia się problem, bo po konwersji do char w konsoli i po zapisaniu do pliku zamiast polskich znaków pokazuje się '?'. Domyślam się, że rozwiązaniem będzie zmiana kodowania, ale sam nie potrafię tego zrobić więc proszę Was o pomoc.

0

Polskie znaki jako char mają wartości większe niż 255, więc w jednym bajcie ich nie zmieścisz...

zamiast ręcznie kodować, zrób sobie coś takiego

byte[] bajtyDoZapisania = jakisString.getBytes("UTF8");
a w drugą stronę
new String(bajty)

0

Polskie znaki jako char mają wartości większe niż 255, więc w jednym bajcie ich nie zmieścisz...

Są większe niż 127, a mniejsze niż 255. Wystarczy wczytany polski znak przekonwertować na int i dla przykładu 'ś" ma numer 197.

byte[] bajtyDoZapisania = jakisString.getBytes("UTF8");
zastosowanie getBytes() dla polskich znaków daje ujemne wartości, bo zmienna byte może przybierać wartości <-128, 127> i następuje pętla przy przekroczeniu +127.

new String(bajty)
przy tej metodzie próbujesz w sytuacji wyjątkowej (tzn przy polskich znakach) z wartości ujemnych stworzyć String co w rezultacie da '?'.

Niestety, nie pomógł Twój sposób. Wiem, bo już wcześniej tak próbowałem.

1

Rozumiesz co mówię/piszę? Polskie znaki mają większe wartości niż 255 jako char, czyli w UTF16...
Tak samo w UTF8 nie są pojedyńczymi bajtami... ś to dwa bajty 197 i 155
lista kilku:

ą - 261, [196,133]
ę - 281, [196,153]
ć - 263, [196,135]
ź - 378, [197,186]
ż - 380, [197,188]
ó - 243, [195,179]
ł - 322, [197,130]
ś - 347, [197,155]

Sam sobie zobacz, że to działa jak należy...

String before = "ąęćźzółś";
byte[] bajty = before.getBytes("UTF8");
String after = new String(bajty, "UTF8");
System.out.println(after);
0

Musiałem troche poczytać o kodowaniu znaków. Nie wiedziałem, że niektóre są reprezentowane przez dwie liczby. Teraz wszystko działa jak powinno. Dzięki za pomoc!

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