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

Java 8更改UTF-8解码

卢权
2023-03-14
问题内容

最近,我们将应用程序从JDK 7迁移到了JDK8。更改之后,我们遇到了以下代码段的问题。

String output = new String(byteArray, "UTF-8");

字节数组可能包含无效的UTF-8字节序列。UTF-8解码时,相同的字节数组在Java 7和Java 8上产生两个不同的字符串。

根据此SO帖子的答案,Java
8“修复”了Java7中的错误,并用替换字符串替换了无效的UTF-8字节序列,该字符串符合UTF-8规范。

但是我们想坚持使用Java 7的解码字符串版本。

我们尝试在Java8上将CharsetDecoder与CodingErrorAction一起用作REPLACE,REPORT和IGNORE,但是,我们仍然无法生成与Java7相同的字符串。

我们可以用合理复杂性的技术做到这一点吗?


问题答案:

从@Holger提供的指针来看,很明显,我们必须编写一个自定义CharsetDecoder。

我复制了OpenJDK的sun.nio.cs.UTF_8类的版本,将其重命名为CustomUTF_8并使用它来构造这样的字符串

String output = new String(bytes, new CustomUTF_8());

我计划运行广泛的测试,以交叉验证Java 7和Java8上生成的输出。这是一个临时解决方案,而我试图解决将hmac的输出直接传递给String而不首先进行Base64编码的实际问题。

 String output = new String(Base64.Encoder.encode(bytes), Charset.forname("UTF-8"));


 类似资料:
  • 默认情况下,当您将命令的输出重定向到文件或通过管道将其导入PowerShell中的其他内容时,编码是UTF-16,这是不有用的。我想把它改成UTF-8。 可以通过将语法替换为来逐个实现,但每次都要重复这样做会很尴尬。 在PowerShell中设置东西的持久方法是将它们放在中;我已经验证了这个文件确实是在启动时执行的。 曾经说过,可以使用设置输出编码,但我尝试过,没有效果。 https://blog

  • 问题内容: 如何使用Android解码utf-8字符串?我尝试使用此命令,但输出与输入相同: 问题答案: 字符串不需要编码。它只是一个Unicode字符序列。 要将字符串转换为字节序列时需要进行 编码 。您选择的字符集(UTF-8,cp1255等)确定了Character-> Byte映射。请注意,字符不必转换为单个字节。在大多数字符集中,大多数Unicode字符都转换为至少两个字节。 字符串的编

  • 作为Python的新手,我已经花了很多时间。 我怎么能解码这样的URL: 到python 2.7中的这个: 返回的内容非常难看。 仍然没有解决办法,任何帮助都是感激的。

  • 问题内容: 嗨,我有一个测试场,我不想在其中进行英语测试(例如 俄语),但是在我的动作课中我得到的不是文字?????????。我 试图编写简单的过滤器,该过滤器描述 了struts2中的参数字符集转换 但是还是不行..有人可以帮我吗 更新我有这个 我想用俄语进行测试,然后将其发送给我的 action。但是在我的action类中,我得到的不是文本,而是纯文本?????????。要解决 此问题,我需要

  • 问题内容: 我正在从外部服务器加载HTML。HTML标记具有UTF-8编码,并包含ľ,š,č,ť,ž等字符。当我使用file_get_contents()加载HTML时,如下所示: 它弄乱了UTF-8字符并加载了Å,¾,¤和类似的废话,而不是正确的UTF-8字符。 我该如何解决? 更新: 我尝试将HTML保存到文件中并以UTF-8编码输出。两者都不起作用,所以这意味着file_get_conten

  • 嗨,我试图使我在UTF-8兼容的应用程序之一。我的环境如下:linux操作系统,apahce网络服务器作为超文本传输协议监听器,tomcat作为servlet引擎 配置了mod_jk和tomcat的apache s使用ajp连接器。 我已经从少数网站上阅读了UTF-8的基本指南,并根据建议尝试了以下方法 为服务器中的连接器设置和。xml 设置语言bashrc/. file使用 将apache服务器