Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java使用什么编码从给定的unicode数据创建字符串?_Java_Unicode_Encoding_Utf 8_Unicode String - Fatal编程技术网

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

Java使用什么编码从给定的unicode数据创建字符串?,java,unicode,encoding,utf-8,unicode-string,Java,Unicode,Encoding,Utf 8,Unicode String,我很困惑,为什么我不应该用UTF-8编码unicode文本进行比较,而其他文本(要比较的)已经用UTF-8编码了 我想比较一个文本(=アクセス拒否 - 表示访问被拒绝),存储在编码为UTF-8的外部文件中,常量字符串存储在.java文件中 public static final String ACCESS_DENIED_IN_JAPANESE = "\u30a2\u30af\u30bb\u30b9\u62d2\u5426"; // means Access denied java文件编码为C

我很困惑,为什么我不应该用UTF-8编码unicode文本进行比较,而其他文本(要比较的)已经用UTF-8编码了

我想比较一个文本(=アクセス拒否 - 表示访问被拒绝),存储在编码为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用日语编码
访问被拒绝时,并尝试将其与
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
,因为它是不同的编码,无论我们读什么文本,都是相同的


我的理解错在哪里?非常感谢您的澄清。

日语中的访问被拒绝。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`

我知道的最好的方法是将所有静态文本放入一个用UTF-8编码的文本文件中。然后使用
FileReader
读取这些资源,将编码参数设置为“UTF-8”

默认字符集是什么?在日语中,你认为
访问被拒绝\u。getBytes()
有什么作用?@Sotirios Delimanolis:默认字符集-我需要检查我的办公室工作站,所以不确定。它将返回java数组默认字符集(如java doc解释的)。是否有一个提要导入示例?txt?如果使用java 7,您可能需要考虑使用超级Hythy< Cord>文件> RealLink()/<代码>方法:<代码>文件。注意,跳这个
新字符串(utf8Bytes,utf8charset)
舞蹈基本上是不可行的。@Jonathan:是的,我明白你的意思了。只要在读取“String.getBytes”(“UTF-8”)”时使用UTF-8编码,就可能产生预期的输出。需要对此进行测试。谢谢