Java char 型別究竟佔幾個位元組?

Yujiaao發表於2022-06-12

https://docs.oracle.com/en/ja...

Java 版本與 Unicode 版本對應關係

Java releaseUnicode version
Java SE 15Unicode 13.0
Java SE 13Unicode 12.1
Java SE 12Unicode 11.0
Java SE 11Unicode 10.0
Java SE 9Unicode 8.0
Java SE 8Unicode 6.2
Java SE 7Unicode 6.0
Java SE 5.0Unicode 4.0
Java SE 1.4Unicode 3.0
JDK 1.1Unicode 2.0
JDK 1.0.2Unicode 1.1.5

Unicode 一致性

char 型別以及封裝類 java.lang.Character 的欄位和方法是根據 Unicode 標準中的字元資訊定義的,特別是作為 Unicode 字元資料庫一部分的 UnicodeData檔案。此檔案為每個分配的 Unicode 程式碼點或字元範圍指定屬性,包括名稱和類別。該檔案可從 Unicode 聯盟 http://www.unicode.org 獲得。

Unicode 字元表示

char資料型別(以及物件封裝的值 )Character基於原始 Unicode 規範,該規範將字元定義為固定寬度的 16 位實體。此後,Unicode 標準已更改為允許表示需要超過 16 位的字元。合法碼點的範圍現在是 U+0000 到 U+10FFFF,稱為Unicode scalar value。(請參閱Unicode 標準中 U+ n符號 的 定義。)

從 U+0000 到 U+FFFF 的字符集有時稱為基本多語言平面 (BMP)。 碼位大於 U+FFFF 的字元稱為補充字元。Java 平臺在 char 陣列和 String 和 StringBuffer 類中使用 UTF-16 表示。在此表示中,補充字元表示為一對 char 值,第一個來自高代理(high-surrogates) 範圍 (\uD800-\uDBFF),第二個來自 低代理(low-surrogates) 範圍 (\uDC00-\uDFFF)。

因此,一個 char 值表示基本多語言平面 (BMP - Basic Multilingual Plane) 程式碼點,包括代理程式碼點或 UTF-16 編碼的程式碼單元。一個 int 值表示所有 Unicode 程式碼點,包括補充程式碼點。用整型 int 的低 21 位表示 Unicode 程式碼點,高 11 位必須為零。除非另有說明,否則關於補充字元和代理 char 值的行為如下:

  • 只接受char值的方法不支援補充字元。它們將char代理範圍中的值視為未定義的字元。例如, Character.isLetter('\uD840')返回false,即使此特定值後跟字串中的任何低代理值將代表一個字母。
  • 接受int值的方法支援所有 Unicode 字元,包括補充字元。例如,Character.isLetter(0x2F81A)返回 true是因為程式碼點值表示一個字母(CJK 表意文字)。

在 Java SE API 文件中,Unicode 程式碼點(Unicode code point )用於 U+0000 到 U+10FFFF 範圍內的字元值,Unicode 程式碼單元(Unicode code unit)用於 UTF-16 編碼 char 的程式碼單元的 16 位值。有關 Unicode 術語的更多資訊,請參閱 Unicode 詞彙表

總結

看完以上文件,你能回答標題的問題了嗎?
歡迎在評論裡寫下你的答案

相關文章