簡體   English   中英

Java中的4字節Unicode字符

[英]4 byte unicode character in Java

我正在為我的自定義 StringDatatype 編寫單元測試,我需要寫下 4 字節的 unicode 字符。 "\\U" - 不工作(非法轉義字符錯誤),例如:U+1F701 (0xf0 0x9f 0x9c 0x81)。 怎么可以寫成字符串?

Unicode 代碼點不是 4 個字節; 它是一個整數(目前范圍從 U+0000 到 U+10FFFF)。

你的 4 個字節是(猜測)它的 UTF-8 編碼版本(編輯:我是對的)。

你需要這樣做:

final char[] chars = Character.toChars(0x1F701);
final String s = new String(chars);
final byte[] asBytes = s.getBytes(StandardCharsets.UTF_8);

Java 創建時,Unicode 並沒有定義 BMP 之外的代碼點(即 U+0000 到 U+FFFF),這就是一個char只有 16 位長的原因(好吧,好吧,這只是一個猜測,但是我想我在這里不遠了); 從那時起,它必須適應……並且 BMP 之外的代碼點需要兩個字符(前導代理和尾隨代理——Java 分別將它們稱為高代理和低代理)。 Java 中沒有字符文字允許直接在 BMP 之外輸入代碼點。

鑒於char實際上是一個 UTF-16 代碼單元並且有這些字符串文字,您可以在字符串中輸入這個“字符”作為"\?\?" ——或者直接作為符號,如果你計算環境支持它。

另請參閱CharsetDecoderCharsetEncoder類。

另請參見String.codePointCount() ,以及自 Java 8 以來的String.codePoints() (繼承自CharSequence )。

String s = "𩸽";

從技術上講,這是一個字符。 但是要小心s.length()將返回 2。而且 java 不會編譯String s = '𩸽' Java 不向您保證String.length()將返回確切數量的字符,它僅返回存儲此字符串所需的 java-chars 數。

可以從s.codePointCount(0, s.length())獲得實際的字符數。

jshell> String s = "🏳"; s ==> "🏳️"

jshell> s.codePointCount(0, s.length()); $5 ==> 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM