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.
3 odpowiedzi
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()
);
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
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
}
Podobne pytania
Nowe pytania
java
Java to język programowania wysokiego poziomu. Użyj tego tagu, jeśli masz problemy z używaniem lub zrozumieniem samego języka. Ten tag jest rzadko używany samodzielnie i jest najczęściej używany w połączeniu z [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] i [maven].