String z CP1250 do Javy

0

Witam

Borykam się z problemem, który wydaje się trywialny ale...

Używam zewnętrzne biblioteki dll, które dostarczają mi pewnych danych.
Jedna z metod natywnych daje w wyniku Stringa. Jako, że działają pod windowsem ich "naturalną" stroną kodową jest windows 1250 (CP 1250). Taki też wynik dostaje w Javie-Stringa w CP 1250, tylko że java zawsze tworzy Stringa w UTF-16 (niektórzy piszą że w UTF-8 ale to chyba błąd).

Próbowałem zmusić jave do konwersji ale mi nie wychodzi:

//String i tak UTF
String dana = natywnaMetoda.pobierzDane(ktore);
//Znaki w postaci bajtow
byte[] bajty= blad.getBytes("UTF-8");
//Konwersja do znaków CP 1250 i zapis w Stringu
String unicodeString = new String(bajty, "CP1250");

Tylko problem taki ze to nie działa:/
Coś tam jest skonwertowane ale nie w 100%

Pozdrawiam

0

No a wez to przemysl...
najpierw kazesz zapisac stringa jako bajty reprezentujace utf-8
a potem kazesz te same bajty odczytac jako cp1250... przeciez to wciaz utf-8 :>

http://www.exampledepot.com/egs/java.nio.charset/ConvertChar.html

1

Dziękuje za odpowiedz ale niestety sprawa nie była tak trywialna. Otóż kiedy Java native access jest użyty i wywołujemy natywną metodę, która pierwotnie zwracała char* to nie jest możliwe zmapowanie jej tablicą bajtową. Musi być String.

I tu pojawiają się klocki bo JNA ma niby automatyczne kodowanie/odkodowanie Stringów tylko że ten automat (przynajmniej przy moich dll'kach) nie działa. Co gorsza nie ma wtedy możliwości dekodowania w Javie bo np pierwotnie String "błąd" zamienia się w "b'kratka''kratka'd" co bajtowo odpowiada "66 -17 -65 -67 -17 -65 -67 100". Czyli po prostu ł i ą nie są w ogóle czytane.

Rozwiązaniem było ręczne ustawienie kodowania dla całego JNA po władowaniu biblioteki:

   System.setProperty("jna.encoding", "cp1250");

Wtedy z "błąd" otrzymamy już poprawną tablice bajtową "66 -59 -126 -60 -123 100" i mamy w UTF-8 łądnie"błąd";

Natomiast jeżeli jest metoda która daje bajtową tablicę to poprosru zamieniamy na String:

 javaString = new String(bajty, "CP1250");

gdzie bajty to return natywnej metody.

Forumowicze pomóc nie chcieli ale dałem rade-po trochę długim czasie w liście mailingowej JNA.
Moze sie komuś przyda.

Pozdrawiam

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