91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解Java語言中一個字符占幾個字節?

發布時間:2020-10-15 17:49:12 來源:腳本之家 閱讀:181 作者:du_xian_sheng 欄目:編程語言

題主要區分清楚內碼(internal encoding)和外碼(external encoding)就好了。

內碼是程序內部使用的字符編碼,特別是某種語言實現其char或String類型在內存里用的內部編碼;
外碼是程序與外部交互時外部使用的字符編碼。“外部”相對“內部”而言;不是char或String在內存里用的內部編碼的地方都可以認為是“外部”。例如,外部可以是序列化之后的char或String,或者外部的文件、命令行參數之類的。

Java語言規范規定,Java的char類型是UTF-16的code unit,也就是一定是16位(2字節);

char, whose values are 16-bit unsigned integers representing UTF-16 code units (§3.1).

然后字符串是UTF-16 code unit的序列:

The Java programming language represents text in sequences of 16-bit code units, using the UTF-16 encoding.

這樣,Java規定了字符的內碼要用UTF-16編碼。或者至少要讓用戶無法感知到String內部采用了非UTF-16的編碼。

另舉一例:

Java標準庫實現的對char與String的序列化規定使用UTF-8作為外碼。Java的Class文件中的字符串常量與符號名字也都規定用UTF-8編碼。這大概是當時設計者為了平衡運行時的時間效率(采用定長編碼的UTF-16)與外部存儲的空間效率(采用變長的UTF-8編碼)而做的取舍。

首先,你所謂的“字符”具體指什么呢?

如果你說的“字符”就是指 Java 中的 char,那好,那它就是 16 位,2 字節。

如果你說的“字符”是指我們用眼睛看到的那些“抽象的字符”,那么,談論它占幾個字節是沒有意義的。

具體地講,脫離具體的編碼談某個字符占幾個字節是沒有意義的。

就好比有一個抽象的整數“42”,你說它占幾個字節?這得具體看你是用 byte,short,int,還是 long 來存它。用 byte 存就占一字節,用 short 存就占兩字節,int 通常是四字節,long 通常八字節。當然,如果你用 byte,受限于它有限的位數,有些數它是存不了的,比如 256 就無法放在一個 byte 里了。

字符是同樣的道理,如果你想談“占幾個字節”,就要先把編碼說清楚。

同一個字符在不同的編碼下可能占不同的字節。

就以你舉的“字”字為例,“字”在 GBK 編碼下占 2 字節,在 UTF-16 編碼下也占 2 字節,在 UTF-8 編碼下占 3 字節,在 UTF-32 編碼下占 4 字節。

不同的字符在同一個編碼下也可能占不同的字節。

“字”在 UTF-8 編碼下占3字節,而“A”在 UTF-8 編碼下占 1 字節。(因為 UTF-8 是變長編碼)
而 Java 中的 char 本質上是 UTF-16 編碼。而 UTF-16 實際上也是一個變長編碼(2 字節或 4字節)。

如果一個抽象的字符在 UTF-16 編碼下占 4 字節,顯然它是不能放到 char 中的。換言之, char 中只能放 UTF-16 編碼下只占 2 字節的那些字符。

而 getBytes 實際是做編碼轉換,你應該顯式傳入一個參數來指定編碼,否則它會使用缺省編碼來轉換。

你說“ new String("字").getBytes().length 返回的是3 ”,這說明缺省編碼是 UTF-8.如果你顯式地傳入一個參數,比如這樣“ new String("字").getBytes("GBK").length ”,那么返回就是 2.

你可以在啟動 JVM 時設置一個缺省編碼,

假設你的類叫 Main,那么在命令行中用 java 執行這個類時可以通過 file.encoding 參數設置一個缺省編碼。比如這樣:java -Dfile.encoding=GBK Main這時,你再執行不帶參數的 getBytes() 方法時,new String("字").getBytes().length 返回的就是 2 了,因為現在缺省編碼變成 GBK 了。當然,如果這時你顯式地指定編碼,new String("字").getBytes("UTF-8").length 返回的則依舊是 3

否則,會使用所在操作系統環境下的缺省編碼。

通常,Windows 系統下是 GBK,Linux 和 Mac 是 UTF-8.但有一點要注意,在 Windows 下使用 IDE 來運行時,比如 Eclipse,如果你的工程的缺省編碼是 UTF-8,在 IDE 中運行你的程序時,會加上上述的 -Dfile.encoding=UTF-8 參數,這時,即便你在 Windows 下,缺省編碼也是 UTF-8,而不是 GBK。

由于受啟動參數及所在操作系統環境的影響,不帶參數的 getBytes 方法通常是不建議使用的,最好是顯式地指定參數以此獲得穩定的預期行為。

以上所述是小編給大家介紹的Java語言中一個字符占幾個字節詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

中江县| 克山县| 伊通| 墨脱县| 简阳市| 井研县| 平和县| 宝坻区| 宜州市| 新昌县| 勃利县| 茶陵县| 噶尔县| 新密市| 清水县| 晋江市| 南部县| 华蓥市| 崇州市| 彰化市| 阿克| 盐山县| 长乐市| 阳新县| 丰顺县| 彭州市| 石台县| 伊春市| 拉萨市| 郸城县| 香港| 杨浦区| 贵南县| 工布江达县| 深水埗区| 开江县| 乐清市| 宾阳县| 观塘区| 诏安县| 曲阜市|