[英]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.