栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

该问题声称(初始)输入是

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 depred.

(如果您的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具有几个字节序列,这些字节序列根本不是有效值,因此您
遇到问题。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/469806.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号