我有客戶端服務器應用程序??蛻舳耍–++ 應用程序)正在發送 UTF8 編碼的字符串,而服務器(Java 應用程序)正在通過套接字端口通信讀取這些字符串。如果服務器托管在具有語言環境 CP-1252 的 Windows 操作系統上,我在讀取服務器端的字符串時會遇到問題。這是偽代碼private transient Socket socket = null;private transient InputStream in = null;private transient OutputStream out = null;socket = new Socket(server, port);out = socket.getOutputStream();in = socket.getInputStream();Socket 和 InputStream 在一些不同的函數中初始化,讀取實際字符串如下函數所示:ReadString(){ byte[] backbytes = new byte[2048]; { if ((c = in.read(backbytes)) > 0) { if (debug) logger.trace("Read " + c + " bytes"); total = total + c; char[] convertedChar = new char[backbytes.length]; int[] convertedInt = new int[backbytes.length]; for(int i=0;i < backbytes.length;i++){ convertedChar[i] = (char) backbytes[i]; convertedInt[i] = (int) backbytes[i]; } logFilePrint.print("Read string as : " + new String(backbytes, 0, c) + " and the converted char[] of byte[] is : "); printArray(logFilePrint, convertedChar); logFilePrint.print(" and converted int[] is : " ); printArray(logFilePrint, convertedInt); logFilePrint.flush(); sb.append(new String(backbytes, 0, c)); } else { break; } }}某些 Unicode 字符(例如“私”或“の”)會出現此問題。如果我對這些字符執行上述代碼,我會得到輸出將字符串讀為:?§??? byte[] 轉換后的 char[] 為:[, ?, ?, ?,  ̄, ?,] 轉換后的 int[] 為:[, -25, -89, 63, -29, 63, -82, ]但是,如果我通過使用“-Dfile.encoding=UTF-8”將 JVM 的字符集設置為 UTF8 來更改服務器編碼,我會得到以下輸出:將字符串讀為:私の,byte[]轉換后的char[]為:[, ?, ?, ?,  ̄, ?, ?] 轉換后的int[]為:[, -25, -89, -127, -29, -127, -82,]非 UTF8 模式下的問題似乎與字節“0x81”的字符有關。敵人例如字符'私'有UTF-8編碼'0xE7 0xA7 0x81'和'の'有UTF-8編碼'0xE3 0x81 0xAE'據我了解,InputStream“in.read(backbytes)”只是讀取發送的數據字節。為什么在 JVM 字符集是 UTF-8 和非 UTF8 的情況下讀取字節會受到影響?函數“讀取”語言環境是否依賴?
1 回答

慕尼黑5688855
TA貢獻1848條經驗 獲得超2個贊
您選擇的構造函數String(byte[] encoded, int offset, int length)
使用默認平臺編碼將字節轉換為字符。它顯式地取決于它運行的環境。
對于可移植代碼來說,這是一個糟糕的選擇。對于網絡應用程序,明確指定要使用的編碼。您可以將其作為網絡協議的一部分進行協商,或者指定一個有用的默認值,如 UTF-8。
有多種 API 可以對文本進行編碼和解碼。例如,String(byte[] encoded, int offset, int length, Charset encoding)
可以像這樣使用 String 構造函數:
String str = new String(backbytes, 0, c, StandardCharsets.UTF_8);
添加回答
舉報
0/150
提交
取消