激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 詳解Java語言中一個字符占幾個字節?

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

2021-07-31 11:54du_xian_sheng Java教程

這篇文章主要介紹了Java語言中一個字符占幾個字節,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

題主要區分清楚內碼(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語言中一個字符占幾個字節詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

原文鏈接:https://blog.csdn.net/h12kjgj/article/details/73496949

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产拍拍拍三级费视频在线观看 | 日本欧美一区二区三区在线播 | 国产一区二区三区视频在线 | 午夜精品成人一区二区 | 成年人免费视频播放 | 日本一区二区不卡高清 | 黄色视屏免费在线观看 | 成人偷拍片视频在线观看 | 久久久一二三 | 黄色网址入口 | 视频一区国产 | 亚洲国产女同久久 | 久草手机在线 | 美国一级黄色毛片 | 欧美成人国产va精品日本一级 | 国产超碰人人爽人人做人人爱 | 一级α片| 亚洲视频高清 | 91看片国产 | 亚洲精品 欧美 | 中文字幕精品在线视频 | 成人在线视频在线观看 | www.91sp | 久久精品久久精品国产大片 | 国产91免费看 | 把娇妻调教成暴露狂 | 福利在线播放 | 午夜视频免费在线观看 | 亚洲视频综合 | 羞羞草视频 | 天天看天天摸天天操 | 国产精品免费麻豆入口 | 日韩视频一二区 | 超级av在线| 久久精品亚洲精品国产欧美kt∨ | 久久99精品久久久久久秒播蜜臀 | 国产精品视频yy9299一区 | 羞羞视频免费网站 | 欧美 亚洲 视频 | 国产亚洲精品久久 | 欧美一区2区三区4区公司二百 |