2012-02-21 33 views
0

我在套接字编程中遇到了一个小问题(我相信)。从非英语语言发送文本时,出现乱码。经过很多关于谷歌的研究,我做了一些更正。我将getBytes()更改为getBytes("UTF-8"),并尝试发送一些阿拉伯文字。在java中通过套接字的Unicode文本

在本地连接套接字时,它工作正常。我看到了我期待的阿拉伯文字。但是当从网上进行测试时,结果会显示奇怪/乱码的字符。

这里是我试过的文字:

“مرحبا”(这是“你好”的阿拉伯文字),它显示我为“U ... O±Øبا”

请帮助我在解决这个问题。

+0

发布您的服务器写入和客户端读取代码 – 2012-02-21 20:39:05

回答

4

这是我已经躺在附近的一些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() 
         ); 
+0

是的人“InputStreamReader&OutputStreamWriter”为我做了很好的工作......谢谢你的贡献...... – 2012-02-27 13:40:28

0

我认为解决这个问题最简单的方法是使用一个Serialized对象,它有一个String容器和里面的阿拉伯文本。

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

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

然后在接收端,这样做:

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

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

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

为什么你不只是用正确的解码器包装流?手动解码数据到一个全部在一个编码中的数据流或从这个数据流解码数据肯定是错误的方法,你不觉得吗? – tchrist 2012-02-21 21:02:59

+0

嗯@mersenne我使用相同的就像你说的...与上面两行,你说我成功地发送unicode文本到服务器中的套接字监听器...和服务器获取它后,它发送到其他客户端侦听器,我得到同样烦人的文字.. – 2012-02-21 21:19:54

+0

@tchrist:什么是正确的解码器呢?建议更改架构是很好的做法,但它需要更详细的示例和一些有关源代码的知识。 – Mersenne 2012-02-21 21:34:13