第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Java InputStream 讀取語言環(huán)境依賴?

Java InputStream 讀取語言環(huán)境依賴?

偶然的你 2022-05-25 16:44:29
我有客戶端服務(wù)器應(yīng)用程序??蛻舳耍–++ 應(yīng)用程序)正在發(fā)送 UTF8 編碼的字符串,而服務(wù)器(Java 應(yīng)用程序)正在通過套接字端口通信讀取這些字符串。如果服務(wù)器托管在具有語言環(huán)境 CP-1252 的 Windows 操作系統(tǒng)上,我在讀取服務(wù)器端的字符串時(shí)會(huì)遇到問題。這是偽代碼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 在一些不同的函數(shù)中初始化,讀取實(shí)際字符串如下函數(shù)所示: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 字符(例如“私”或“の”)會(huì)出現(xiàn)此問題。如果我對這些字符執(zhí)行上述代碼,我會(huì)得到輸出將字符串讀為:?§??? byte[] 轉(zhuǎn)換后的 char[] 為:[, ?, ?, ?,  ̄, ?,] 轉(zhuǎn)換后的 int[] 為:[, -25, -89, 63, -29, 63, -82, ]但是,如果我通過使用“-Dfile.encoding=UTF-8”將 JVM 的字符集設(shè)置為 UTF8 來更改服務(wù)器編碼,我會(huì)得到以下輸出:將字符串讀為:私の,byte[]轉(zhuǎn)換后的char[]為:[, ?, ?, ?,  ̄, ?, ?] 轉(zhuǎn)換后的int[]為:[, -25, -89, -127, -29, -127, -82,]非 UTF8 模式下的問題似乎與字節(jié)“0x81”的字符有關(guān)。敵人例如字符'私'有UTF-8編碼'0xE7 0xA7 0x81'和'の'有UTF-8編碼'0xE3 0x81 0xAE'據(jù)我了解,InputStream“in.read(backbytes)”只是讀取發(fā)送的數(shù)據(jù)字節(jié)。為什么在 JVM 字符集是 UTF-8 和非 UTF8 的情況下讀取字節(jié)會(huì)受到影響?函數(shù)“讀取”語言環(huán)境是否依賴?
查看完整描述

1 回答

?
慕尼黑5688855

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超2個(gè)贊

您選擇的構(gòu)造函數(shù)String(byte[] encoded, int offset, int length)使用默認(rèn)平臺(tái)編碼將字節(jié)轉(zhuǎn)換為字符。它顯式地取決于它運(yùn)行的環(huán)境。

對于可移植代碼來說,這是一個(gè)糟糕的選擇。對于網(wǎng)絡(luò)應(yīng)用程序,明確指定要使用的編碼。您可以將其作為網(wǎng)絡(luò)協(xié)議的一部分進(jìn)行協(xié)商,或者指定一個(gè)有用的默認(rèn)值,如 UTF-8。

有多種 API 可以對文本進(jìn)行編碼和解碼。例如,String(byte[] encoded, int offset, int length, Charset encoding)可以像這樣使用 String 構(gòu)造函數(shù):

String str = new String(backbytes, 0, c, StandardCharsets.UTF_8);


查看完整回答
反對 回復(fù) 2022-05-25
  • 1 回答
  • 0 關(guān)注
  • 121 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號