我在套接字编程中面临一个小问题(我相信)。从非英语语言发送文本时,我得到了乱码的结果。经过对谷歌的大量研究,我做了一些修改。我将getBytes()
更改为getBytes("UTF-8")
并尝试发送一些阿拉伯文字。
在本地连接套接字时,它可以正常工作。我看到了我所期待的阿拉伯语文本。但是在线测试时,结果显示奇怪/乱码。
这是我试过的文字:
“مرحبا”(这是“hello”的阿拉伯文字),向我显示为“Ù......رØبا”
请帮我解决这个问题。
答案 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
}