當前位置:成語大全網 - 新華字典 - 壹個漢字占幾個字符?

壹個漢字占幾個字符?

如果妳說的“字符”就是指 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 方法通常是不建議使用的,最好是顯式地指定參數以此獲得穩定的預期行為。