亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java InputStream 讀取語言環境依賴?

Java InputStream 讀取語言環境依賴?

偶然的你 2022-05-25 16:44:29
我有客戶端服務器應用程序??蛻舳耍–++ 應用程序)正在發送 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);


查看完整回答
反對 回復 2022-05-25
  • 1 回答
  • 0 關注
  • 123 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號