当前位置: 首页 > 知识库问答 >
问题:

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

颛孙子民
2023-03-14

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

public static final String ACCESS_DENIED_IN_JAPANESE = "\u30a2\u30af\u30bb\u30b9\u62d2\u5426"; // means Access denied 
 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_japine并尝试将其与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,因为编码不同,无论我们读的文本是一样的。

我的理解哪里错了?如有任何澄清,不胜感激。

共有1个答案

贡斌
2023-03-14

access_denied_in_japines.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中显示Unicode字符。如果我这样做,则效果很好: 符号等于“∂”。这是我想要的。 问题是我知道Unicode号,因此需要从中创建Unicode符号。我(对我)尝试了显而易见的事情: 但是,在这种情况下,符号等于“ \ u2202”。那不是我想要的 如果我知道符号的Unicode编号(但只能在运行时-我不能像第一个示例那样对其进行硬编码),如何构造该符号? 问题答案:

  • 最近,我们开始使用Oracle12c数据库,现在我们遇到了文件夹名称中包含特殊字符的问题(例如“š"、”č"、“ot”\“)。虽然创建了文件夹,但没有特殊字符--相反,显示了一些字符组合。例如,使用参数“d:/test/testščé”,创建的文件夹是“testé”。因此,每个特殊字符使用2个字符。 数据库是版本12C(12.1.0.2.0),带有NLS_CHARACTERSET al32utf8

  • Windows中使用的默认unicode字符编码是什么?特别是在Windows编程中(Win32和WinRT)。当我在WinAPI中编程时,“char”映射到1字节字符存储,“wchar_t”映射到2字节字符存储。如果UTF-16用4个字节编码所有超过65536的字符,那么Windows如何将这些字符映射为“wchar_t”数据类型?我知道我的问题不够清楚,但我希望你能理解我的一些担忧。非常感谢!

  • 问题内容: 我有一个字符串类型为\ u00C3的文件。我想创建一个由Java中的unicode表示的unicode字符。我尝试过但找不到。救命。 编辑:当我阅读文本文件时,字符串将包含“ \ u00C3”,而不是Unicode字符,而是ASCII字符’'‘u’‘0’‘0’‘3’。我想从该ASCII字符串形成unicode字符。 问题答案: 我在网上的某个地方捡到了这个:

  • 我在Perl中有一个旧版应用程序,最有可能处理以编码的XML,并且需要将该XML的某些数据存储在某个数据库中,该数据库出于历史原因使用。是的,此设置不能支持Unicode标准的所有可能字符,但在实践中,我不需要这样做,并且可以尝试合理的兼容性。 当前的具体问题是一个包含(>)的文件,这使得Perl将Unicode字符串的现有编码中断为 “\x{0308}”未映射到cp1252 我使用Unicode

  • 问题内容: 我知道django在整个框架中使用unicode字符串,而不是普通的python字符串。普通的python字符串使用什么编码?他们为什么不使用unicode? 问题答案: 从Python 3.0开始,默认情况下所有字符串都是unicode,还有bytes数据类型(Python文档)。 因此,python开发人员认为使用unicode是一个好主意,因为在向后兼容性方面,在python 2