2012-02-21 35 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