2011-08-28 111 views
3

我正面臨一些編碼問題,我無法找到正確的解決方案。C#TCP服務器和Java TCP客戶端之間的編碼問題

我有一個C#TCP服務器,作爲接收和響應XML的窗口服務運行,當在輸出中傳遞特殊字符(如帶有重音符號的西班牙語字符(如á,é,í等))時,問題就出現了。

服務器響應正在編碼爲UTF-8,並且java客戶端正在使用UTF-8進行讀取。但是當我打印輸出時,角色完全不同。

此問題只發生在Java客戶端(C#TCP客戶端按預期工作)。

以下是服務器代碼的片段,顯示的編碼問題: C#服務器

byte[] destBytes = System.Text.Encoding.UTF8.GetBytes("á"); 
    try 
    { 
     clientStream.Write(destBytes, 0, destBytes.Length); 
     clientStream.Flush(); 
    }catch (Exception ex) 
    { 
     LogErrorMessage("Error en SendResponseToClient: Detalle::", ex); 
    } 

Java客戶端:

socket.connect(new InetSocketAddress(param.getServerIp(), param.getPort()), 20000); 
InputStream sockInp = socket.getInputStream(); 
InputStreamReader streamReader = new InputStreamReader(sockInp, Charset.forName("UTF-8")); 
sockReader = new BufferedReader(streamReader); 
String tmp = null; 
while((tmp = sockReader.readLine()) != null){ 
    System.out.println(tmp); 
} 

對於這個簡單的測試,輸出顯示的是:

ß 

我做了一些測試,打印出每種語言的字節[]並同時在C#中的輸出爲: 195,161

在java中的byte []讀取打印爲: -61,-95

這會不會有簽名的(JAVA)做無符號(C# )的字節類型?

任何反饋,非常感謝。

+0

不是一個答案,但一個數據點反正 - Python做解碼C#版本,你打算:'打印'。加入(對於x CHR(x)在[195,161])進行解碼( 'utf-8') - >á'。顯然,如果我嘗試保持這個順序,java的一個不是有效的utf-8。 – viraptor

+0

謝謝,我還在試驗。 (到目前爲止沒有運氣)。 – jcgarciam

+0

我在上面的例子中犯了一個錯誤(我已經編輯它),在java byte []中打印爲:-61,-95。這是一個有效的UTF8字符。問題似乎在於操作系統(窗口)本身。我不知道它有什麼奇怪的設置打印錯誤的字符。 – jcgarciam

回答

1

對我來說這似乎是一個字節序的問題...你可以通過打印字符串之前扭轉的Java字節檢查...

通常會通過包括BOM來解決......看到http://de.wikipedia.org/wiki/Byte_Order_Mark

+0

如果是utf-8,那麼不需要BOM,也不會改變任何東西。 utf-8編碼總是具有相同的表示形式 - 在小型和大型機器上。 (http://unicode.org/faq/utf_bom.html#bom5) – viraptor

+0

在讀完C#和Java中的Endian之後,我仍然有同樣的印象。 – jcgarciam

+0

我認爲問題可能出現在服務器正在運行的地方,創建一個應該打印的簡單Java程序 - >並在那裏運行它打印奇怪的字符,而在其他操作系統(Linux)上打印正確字符。所以我只是丟棄了Socket並從End To End編碼。 – jcgarciam

0

你確定這不是你試圖編碼爲UTF-8數據的字節的Unicode字符嗎?

我發現下面有一個有用的測試方法,可以在發送之前查看該字符串中的數據是否爲正確的UTF-8。

How to test an application for correct encoding (e.g. UTF-8)

+0

我不完全理解你的陳述。從我上面的例子中,我只是得到UTF-8 byte []來測試編碼。 – jcgarciam