Unicode文本通过java中的套接字

时间:2012-02-21 20:33:56

标签: java sockets unicode utf-8

我在套接字编程中面临一个小问题(我相信)。从非英语语言发送文本时,我得到了乱码的结果。经过对谷歌的大量研究,我做了一些修改。我将getBytes()更改为getBytes("UTF-8")并尝试发送一些阿拉伯文字。

在本地连接套接字时,它可以正常工作。我看到了我所期待的阿拉伯语文本。但是在线测试时,结果显示奇怪/乱码。

这是我试过的文字:

“مرحبا”(这是“hello”的阿拉伯文字),向我显示为“Ù......رØبا”

请帮我解决这个问题。

3 个答案:

答案 0 :(得分:5)

这是我用过的一些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()
                         );

答案 1 :(得分:3)

也许,你忘了在创建字符串时指定编码。

byte[] utf8bytes = yourString.getBytes("UTF-8");       // encoding
String otherString = new String(utf8bytes, "UTF-8");   // decoding

答案 2 :(得分:0)

我认为解决这个问题的最简单方法是使用一个Serialized对象,该对象具有一个包含您的阿拉伯语文本的String容器。

不要直接写字节,而是使用:

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

然后在接收端,执行此操作:

if (receivedObject instanceof YourContainer) {
    // get out arabic string
}