当前位置: 首页 > 面试题库 >

Java中的“修复”字符串编码

步弘和
2023-03-14
问题内容

我使用UTF-8编码Stringbyte[]数组创建了一个。
但是,它应该已经使用其他编码创建(Windows-1252)。

有没有办法将此String转换回正确的编码?

我知道如果可以访问原始字节数组很容易做到,但是就我而言,为时已晚,因为它是由封闭的源库提供的。


问题答案:

关于这是否可行似乎有些困惑,我想我需要提供一个广泛的例子。

该问题声称(初始)输入是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,因为这三个字母(以及大多数其他字母)在这两种编码中位于同一位置)。

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

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

显然这会产生错误的输出“ B”。

目标将是 仅* 提供可用的内容ib(或对其进行正确的解码byte[])。 *is

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

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

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

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

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

因此, 在这种情况下, 您将无法撤消该操作,因为信息会丢失。


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



 类似资料:
  • 我有一个String,newNumber=106,nn=3和差异=3。 输出: 我想修改这个字符串,使输出变成,然后用这个新字符串我想再次修改它,使它变成,基本上我只需要替换新的数字,它是106,并且一直变为11,正如你所看到的,我试图只修改newNumber并用另一个替换它,同时保持整个字符串不变,我只是替换并添加它,这是如何实现的?输出应该是这样的,输出: 我在用步骤求解一个方程,公式无关紧要

  • 问题内容: 就像标题所说的那样,我正在尝试在Java中将字符串“ test”编码为base32字符串“ ORSXG5A =“。 我在网上搜索时发现的所有类都是使用32位从字符串编码为数组的类,但是显然这不是我想要的。 很抱歉这个新手问题。 问题答案: Apache commons编解码器提供了一个可以执行此操作的类 版画 您可以在此处下载。

  • 问题内容: 下面程序的输出: 是: 然而 如何从字符串的开头和结尾删除换行符(Java)? 否则说。 我想念什么? 问题答案: 既然是一成不变的 不会更改基础值,它会返回一个没有开头和结尾空格字符的新值。您需要替换参考

  • 问题内容: 与该方法等效的 JavaScript 是什么: C#仅在字符串的 开头 和 结尾 处修剪所选字符! 问题答案: 一行就足够了: 在功能上:

  • 问题内容: 如何修剪Java字符串中的开头或结尾字符? 例如,斜杠字符“ /”-我对空格不感兴趣,并且希望在不同的时间修剪前导或尾随字符。 问题答案: 你可以用 领导: 尾随:

  • 问题内容: Java字符串修剪不会为我删除空格字符。 输出为。请注意1右边的空间。 我必须从字符串中删除尾随空格,但既不要也不删除它。 无论哪种方式,字符串都保持相同。 编辑:完整代码 :: 为什么我不能删除那个空间? 问题答案: 该网站的源代码显示特殊的html字符。尝试在您的java字符串中搜索或替换以下内容:。 那是一个不可破坏的空间。请参阅:我有一个带有“ \ u00a0”的字符串,我需要