gpt4 book ai didi

java - "Fix"Java 中的字符串编码

转载 作者:IT老高 更新时间:2023-10-28 20:52:15 26 4
gpt4 key购买 nike

我有一个使用 UTF-8 编码从 byte[] 数组创建的 String
但是,它应该是使用另一种编码 (Windows-1252) 创建的。

有没有办法将此字符串转换回正确的编码?

我知道如果您可以访问原始字节数组,这很容易做到,但在我的情况下为时已晚,因为它是由封闭源代码库提供的。

最佳答案

由于这是否可行似乎有些困惑,我认为我需要提供一个广泛的示例。

问题声称(初始)输入是一个 byte[],其中包含 Windows-1252编码数据。我将其称为 byte[] ib (用于“初始字节”)。

在本例中,我将选择德语单词“Bär”(意为熊)作为输入:

byte[] ib = new byte[] { (byte) 0x42, (byte) 0xE4, (byte) 0x72 };
String correctString = new String(ib, "Windows-1252");
assert correctString.charAt(1) == '\u00E4'; //verify that the character was correctly decoded.

(如果您的 JVM 不支持该编码,那么您可以改用 ISO-8859-1,因为这三个字母(以及大多数其他字母)在这两种编码中的位置相同)。

问题继续说明一些其他代码(不在我们的影响范围内)已经使用 UTF-8 编码将 byte[] 转换为字符串(我称之为 String is 表示“输入字符串”)。 String唯一可用于实现我们目标的输入(如果 ib 可用,那将是微不足道的):

String is = new String(ib, "UTF-8");
System.out.println(is);

这显然会产生不正确的输出“B�”。

目标是生成 ib(或该 byte[] 的正确解码)only is可用。

现在有人声称从 is 获取 UTF-8 编码字节将返回一个与初始数组具有相同值的数组:

byte[] utf8Again = is.getBytes("UTF-8");

但这会返回 B 这两个字符的 UTF-8 编码,并且在重新解释为 Windows-1252 时肯定会返回错误的结果:

System.out.println(new String(utf8Again, "Windows-1252");

这一行产生的输出“B�”是完全错误的(如果初始数组包含非单词“Bür”,这也是相同的输出)。

所以在这种情况下您无法撤消操作,因为丢失了一些信息。

实际上有可以撤消此类错误编码的情况。当所有可能的(或至少发生的)字节序列在该编码中有效时,它更有可能起作用。由于 UTF-8 有几个字节序列根本不是有效值,因此您遇到问题。

关于java - "Fix"Java 中的字符串编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2622911/

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