博客 / 詳情

返回

Java char 類型究竟佔幾個字節?

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

Java 版本與 Unicode 版本對應關係

Java release Unicode version
Java SE 15 Unicode 13.0
Java SE 13 Unicode 12.1
Java SE 12 Unicode 11.0
Java SE 11 Unicode 10.0
Java SE 9 Unicode 8.0
Java SE 8 Unicode 6.2
Java SE 7 Unicode 6.0
Java SE 5.0 Unicode 4.0
Java SE 1.4 Unicode 3.0
JDK 1.1 Unicode 2.0
JDK 1.0.2 Unicode 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 詞彙表。

總結

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

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.