這裏是場景: 我有一個簡單的客戶端和服務器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)發送回客戶端時,「???」正在發送而不是原始字符串。
我在做什麼錯?我如何防止字符的這種轉換?
您顯示的用於發送和接收的代碼是正確的。問題必須在其他地方,比如在用來在屏幕上顯示字符串的代碼中。 – Joni
將您的編輯器和System.out設置爲UTF-8字符編碼,然後重試。 – Nayuki
如果我的代碼是正確的,爲什麼我會看到「???」在wireshark中的響應數據包?數據本身可以在什麼點被操縱? –