Unicode текст через сокет в Java - PullRequest
0 голосов
/ 22 февраля 2012

Я столкнулся с крошечной проблемой (я верю) в программировании сокетов.При отправке текста с неанглийских языков я получаю искаженные результаты.После долгих исследований в Google, я внес некоторые исправления.Я изменил getBytes() на getBytes("UTF-8") и попытался отправить арабский текст.

При локальном подключении сокетов все работает нормально.Я вижу арабский текст, который я ожидал.Но при тестировании из Интернета результаты отображают странные / искаженные символы.

Вот текст, который я пробовал:

"مرحبا" (это арабский текст "привет"), который отображался дляменя как "Ù… Ø ± Øبا"

Пожалуйста, помогите мне в решении этой проблемы.

Ответы [ 3 ]

5 голосов
/ 22 февраля 2012

Это некоторый Java-код, который я лежал без дела и который используется для установки кодировок потоков в паре байтовых потоков, но вы можете сделать то же самое с одноэлементным кодом, по крайней мере, предполагая, что вы используете сокеты потоков TCP, а не дейтаграммы 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()
                         );
3 голосов
/ 22 февраля 2012

Возможно, вы забыли указать кодировку при создании строки.

byte[] utf8bytes = yourString.getBytes("UTF-8");       // encoding
String otherString = new String(utf8bytes, "UTF-8");   // decoding
0 голосов
/ 22 февраля 2012

Я думаю, что самый простой способ решить эту проблему - использовать сериализованный объект, в котором есть контейнер String с вашим арабским текстом внутри.

Не записывайте байты напрямую, вместо этого используйте:

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

Затем на приемном конце сделайте следующее:

if (receivedObject instanceof YourContainer) {
    // get out arabic string
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...