[英]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 代碼單元並且有這些字符串文字,您可以在字符串中輸入這個“字符”作為"\?\?"
——或者直接作為符號,如果你計算環境支持它。
另請參閱CharsetDecoder
和CharsetEncoder
類。
另請參見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.