gpt4 book ai didi

java - Java 使用什么编码从给定的 unicode 数据创建字符串?

转载 作者:行者123 更新时间:2023-11-30 03:14:49 26 4
gpt4 key购买 nike

我很困惑为什么当其他文本(要比较)已使用 UTF-8 编码时我不应该使用 UTF-8 编码 unicode 文本进行比较?

我想将存储在编码为 UTF-8 的外部文件中的文本(= akusesu拒否 - 表示访问被拒绝)与存储在 .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 encodedAccessDenied = new String(ACCESS_DENIED_IN_JAPANESE.getBytes(StandardCharsets.UTF_8),StandardCharsets.UTF_8
);

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

关于java - Java 使用什么编码从给定的 unicode 数据创建字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32894853/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com