2016-02-25 57 views
0

這裏是場景: 我有一個簡單的客戶端和服務器Java程序。 客戶端向服務器發送一個希伯來字符串:אבג空格分隔。java - 網絡上的希伯來字符被接收爲問號

發送該數據報的客戶端代碼:

DatagramPacket packet = new DatagramPacket(msg.getBytes("UTF-8"), msg.getBytes("UTF-8").length); 
packet.setSocketAddress(targetSock); 
this.sock.send(packet); 

味精是字符串類型,並且它包含希伯來語字符(從一個機器人的EditText對象)

Wireshark的顯示字符串如下: d7 90 20 d7 91 20 d7 92

0x20是空格,希伯來字符是d7 90(1,2)。

接收該消息服務器上的代碼: 「????」

receivedata = new byte[size]; 
DatagramPacket recv_packet = new DatagramPacket(receivedata, receivedata.length); 
inSocket.receive(recv_packet); 
String msg = new String(receivedata, Charset.forName("UTF-8")); 
System.out.println("[" + recv_packet.getSocketAddress() + "]: " + msg); 

中的println()調用打印但編輯器無法打印unicode字符可以解釋它。但是,當服務器將此字符串(msg)發送回客戶端時,「???」正在發送而不是原始字符串。

我在做什麼錯?我如何防止字符的這種轉換?

+1

您顯示的用於發送和接收的代碼是正確的。問題必須在其他地方,比如在用來在屏幕上顯示字符串的代碼中。 – Joni

+0

將您的編輯器和System.out設置爲UTF-8字符編碼,然後重試。 – Nayuki

+0

如果我的代碼是正確的,爲什麼我會看到「???」在wireshark中的響應數據包?數據本身可以在什麼點被操縱? –

回答

0

嘗試通過CMD通過Java發送字符,看看它是否工作。例如,運行java println(HEBREW CHAR),看它是否通過那裏。它可能是解釋服務器的問題。

0

我有這樣的問題,所以我做了一個字母「dictonary」,並使得א成爲b等等,並且在將其轉換爲英文之前製作了一些頭部,該頭部會在讀取時告訴應用它需要轉化回希伯來語。 例如,這個詞將是現在ֱֹֹ!!ENGLISHaba