簡體   English   中英

Java如何將3字節Unicode字符裝入char類型?

[英]How does Java fit a 3 byte Unicode character into a char type?

所以Java中的'char'是2個字節。 (可以從這里驗證。)

我有這個示例代碼:

public class FooBar {
    public static void main(String[] args) {
        String foo = "€";
        System.out.println(foo.getBytes().length);
        final char[] chars = foo.toCharArray();
        System.out.println(chars[0]);
    }
}

輸出如下:

3
€

我的問題是,Java如何將3字節字符裝入char數據類型? 順便說一句,我正在使用參數運行應用程序:-Dfile.encoding = UTF-8

此外,如果我進一步編輯代碼並添加以下語句:

File baz = new File("baz.txt");
final DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(baz));
dataOutputStream.writeChar(chars[0]);
dataOutputStream.flush();
dataOutputStream.close();

最終文件“baz.txt”將只有2個字節,即使我將其視為UTF-8文件,它也不會顯示正確的字符。

編輯2:如果我用UTF-16 BE編碼打開文件“baz.txt”,我會在文本編輯器中看到€字符就好了,我覺得這很有道理。

String.getBytes()使用平台的默認字符編碼返回字節,該編碼不必與內部表示匹配。

Java在ram中為每個char使用2個字節,當使用UTF-8“序列化”字符時,它們可能在生成的字節數組中產生一個,兩個或三個字節,這就是UTF-8編碼的工作方式。

您的代碼示例使用的是UTF-8。 Java字符串使用UTF-16編碼在內存中。 不適合單個16位字符的Unicode代碼點將使用稱為代理項對的2字符對進行編碼。

如果未將參數值傳遞給String.getBytes(),則返回一個字節數組,該數組具有使用底層操作系統的默認字符集編碼的String內容。 如果要確保UTF-8編碼的陣列,則需要使用getBytes(“UTF-8”)。

調用String.charAt()僅從String的內存存儲中返回原始UTF-16編碼的char。

檢查此鏈接: java utf8 encoding - char,string types

Java使用UTF-16(16位)進行內存中表示。

即使它需要UTF-8中的三個字節,那歐元符號也適用於此。

暫無
暫無

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

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