Kodowanie stringów

0

Witam,
chce przesyłać stringa przez socketa i robie tak:

bw = new DataOutputStream(s.getOutputStream());
...
bw.writeChars(" jakiś tam tekst");

następnie odczytuje:

d = new BufferedReader(new InputStreamReader(s.getInputStream()));
...
String tmp = d.readLine();

i otrzymuje krzaczki, tzn. co drugi znam to \u0000 czy cos takiego. Poza tym nie ma polskich liter.
Robie tak:
ne = new String(tmp.getBytes("windows-1250"), "Cp1250");

i nie zmienia kodowania. UTF-8 i iso też nie działa. :-( w czym tu jest problem. Wydaje mi sie ze to banał jakiś.

0
  1. UTF-8 to standardowe kodowanie Javy
  2. Jeśli chcesz odczytać dane przez readLine() wysłany String musi zawierać znak nowej linii "\n"
0

1.whatever, lokalnie wyświetla stringa poprawnie
2.wiem, jest na końcu zawsze

0

ne = new String(tmp.getBytes("windows-1250"), "Cp1250");
ta linijka jest bez sensu, jdyne co robi to bierze stringa tmp, koduje go do tablicy bajtow z kodowaniem windows-1250, a nastepnie tworzy nowego stringa z kodowaniem cp1250, ktore jest dokladnie tym samym co to poprzednie, to tylko 2 aliasy na to samo, sprawdz:

public class Test {

public static void main(String[] args) throws Exception {
    Charset c = Charset.forName("windows-1250");
    for (String s : c.aliases()) {
        System.out.println(s);
    }
}

}

co do \n - mowisz ze masz zawsze, w przykladzie ktory podales nie masz tego :>

zapisujesz uzywajac DataOutputStream, czyli streama ktory dziala na bajtach, a czytasz uzywajac Readera ktory dziala na charach, wiec jestes niekonsekwentny.

mozesz robic tak:

String s = "string";
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(outputStreamSocketa, "UTF-8"));
bw.write(s + "\n"); //zapisujemy stringa, wewnatrz przechodzi kodowanie UTF-8, dodatrkowo dodajemy enlina na koniec
...
bw.flush() / bw.close(); // close robi flusha zanim zamknie strumien

no i teraz po drugiej stronie:

BufferedReader br = new BufferedReader(new InputStreamReader(inputStreamSocketa, "UTF-8"));
String line = br.readLine();
...
br.close();

voila

przy czym kodowanie InputStreamReadera i UptputStreamWriterea nalezy podawac jesli program uruchamiany jest na platformch z roznym kodowaniem domyslnym (np win: cp1250, lin: utf-8) zeby ladnie sie wszystko czytalo i zapisywalo. jesil program zabawka z windy na winde np to nie trzeba wcale podawac kodowania, standardowo radzi sobie znakomicie

0

p.s.
java wewnetrznie koduje w utf-16

pozdro

0

O to chodziło, dzięki bardzo :-)

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