簡體   English   中英

Java使用哪種編碼從給出的unicode數據創建字符串?

[英]What encoding Java uses to create string from give unicode data?

我很困惑為什么當其他文本(要比較)已經用UTF-8編碼時,為什么不應該使用UTF-8編碼unicode文本進行比較呢?

我想將存儲在編碼為UTF-8的外部文件中的文本(=アクセス拒絕否-表示拒絕訪問)與存儲在.java文件中的常量字符串進行比較。

public static final String ACCESS_DENIED_IN_JAPANESE = "\u30a2\u30af\u30bb\u30b9\u62d2\u5426"; // means Access denied 

該Java文件被編碼為Cp1252。

我通過使用以下代碼將文件作為輸入流讀取。 請注意,我正在使用UTF-8進行編碼。

 InputStream in = new FileInputStream("F:\\sample.txt");
        int b1; 
        byte[] bytes = new byte[4096];
        int i = 0;
        while (true) {
            b1 = in.read();
            if (b1 == -1)
                break;
            bytes[i++] = (byte) b1;
        }

        String japTextFromFile = new String(bytes, 0, i, Charset.forName("UTF-8"));

現在當我比較為

System.out.println(ACCESS_DENIED_IN_JAPANESE.equals(japTextFromFile));  // result is `true` , and works fine

但是當我使用UTF-8編碼ACCESS_DENIED_IN_JAPANESE並嘗試與japTextFromFile進行比較時,結果為false 該代碼是

String encodedAccessDenied = new String(ACCESS_DENIED_IN_JAPANESE.getBytes(),Charset.forName("UTF-8"));

System.out.println(encodedAccessDenied .equals(japTextFromFile));  // result is `false`

因此,我的疑問是,當兩個字符串相同並且已使用UTF-8編碼時,為什么上面的比較失敗了? 結果應該是true

但是,在第一種情況下,當將不同的編碼字符串(一個使用UTF-16(Java默認的編碼字符串方式),另一個使用UTF-8)進行比較時,結果為true ,我認為應該是false因為它是不同的編碼,無論我們閱讀的文字是相同的。

我的理解哪里錯了? 任何澄清是極大的贊賞。

ACCESS_DENIED_IN_JAPANESE.getBytes()不使用UTF-8。 它使用平台的默認字符集。 但是,然后您使用UTF-8將那些字節變回字符串。 這為您提供了與開始時不同的String。

嘗試這個:

String encodedAccessDenied = new String(ACCESS_DENIED_IN_JAPANESE.getBytes(StandardCharsets.UTF_8),StandardCharsets.UTF_8
);

System.out.println(encodedAccessDenied .equals(japTextFromFile));  // result is `true`

我知道的最好方法是將所有靜態文本放入使用UTF-8編碼的文本文件中。 然后使用FileReader讀取這些資源,將編碼參數設置為“ UTF-8”

暫無
暫無

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

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