Mam do czynienia z małym problemem (wierzę) w programowaniu gniazd. Wysyłając tekst z języków innych niż angielski, otrzymuję zniekształcone wyniki. Po wielu poszukiwaniach w google wprowadziłem kilka poprawek. Zmieniłem getBytes() na getBytes("UTF-8") i próbowałem wysłać tekst w języku arabskim.

Przy podłączaniu gniazd lokalnie działa dobrze. Widzę tekst w języku arabskim, którego się spodziewałem. Ale podczas testowania z Internetu wyniki wyświetlają dziwne/niewyraźne znaki.

Oto tekst, który wypróbowałem:

„مرحبا” (to arabski tekst „cześć”), który wyświetlał mi się jako „مرØبا”

Pomóż mi rozwiązać ten problem.

0
Dinesh Ravichandran 22 luty 2012, 00:33

3 odpowiedzi

Najlepsza odpowiedź

To jest kod Java, który leżałem wokół, który służy do ustawiania kodowania strumienia dla pary strumieni bajtów, ale możesz zrobić to samo z singletonem, przynajmniej zakładając, że używasz gniazd strumienia TCP, a nie datagramów UDP.

    Process
    slave_process = Runtime.getRuntime().exec("cmdname -opts cmdargs");

 OutputStream
 __bytes_into_his_stdin  = slave_process.getOutputStream();

 OutputStreamWriter
   chars_into_his_stdin  = new OutputStreamWriter(
                             __bytes_into_his_stdin,
         /* DO NOT OMIT! */  Charset.forName("UTF-8").newEncoder()
                         );

 InputStream
 __bytes_from_his_stdout = slave_process.getInputStream();

 InputStreamReader
   chars_from_his_stdout = new InputStreamReader(
                             __bytes_from_his_stdout,
         /* DO NOT OMIT! */  Charset.forName("UTF-8").newDecoder()
                         );

 InputStream
 __bytes_from_his_stderr = slave_process.getErrorStream();

 InputStreamReader
   chars_from_his_stderr = new InputStreamReader(
                             __bytes_from_his_stderr,
         /* DO NOT OMIT! */  Charset.forName("UTF-8").newDecoder()
                         );
5
tchrist 22 luty 2012, 01:47

Być może zapomniałeś określić kodowanie podczas tworzenia łańcucha.

byte[] utf8bytes = yourString.getBytes("UTF-8");       // encoding
String otherString = new String(utf8bytes, "UTF-8");   // decoding
4
Mersenne 22 luty 2012, 00:42

Myślę, że najłatwiejszym sposobem rozwiązania tego byłoby użycie obiektu Serialized, który ma kontener String z tekstem arabskim w środku.

Nie pisz bezpośrednio bajtów, zamiast tego użyj:

ObjectOutputStream oos = yourSocket.getOutputStream();
oos.writeObject(yourContainer);

Następnie po stronie odbierającej zrób to:

if (receivedObject instanceof YourContainer) {
    // get out arabic string
}
0
Shinzul 22 luty 2012, 00:40