【问题标题】:Recover wrongly encoded character (Java )恢复错误编码的字符(Java)
【发布时间】:2016-08-11 07:47:18
【问题描述】:

我们在 Linux 中使用 cron 运行了一些 java 代码,以将数千条记录保存在生产数据库中。该框中的语言环境charmap 是“ANSI_X3.4-1968”。现在,我们在将它们持久化到数据库之前采取了以下步骤。 1.对文本使用StringEscapeUtils.unescapeHtml4 2. 将String写入UTF-8格式并持久化到数据库中

现在的问题是在这些步骤之后特殊字符显示为“?”。是否可以将其还原为原始角色? 我已经通过以下步骤模拟了问题。

  1. 将 Eclipse 编码更改为“ANSI_X3.4-1968”
  2. 编写以下代码行
 

String insertSpecial = StringEscapeUtils.unescapeHtml4("×");
System.out.println(insertSpecial);
String uni = new String(insertSpecial.getBytes(), "UTF-8");// This value is currently in DB
System.out.println(uni);

现在我想从字符串“uni”中取回“×”。任何帮助将不胜感激。

【问题讨论】:

    标签: java encoding utf-8


    【解决方案1】:

    基本上没有。你在new String(insertSpecial.getBytes(), "UTF-8"); 中犯了最大的错误,这再次表明字符编码非常难以处理。

    那段代码的作用,一步一步:

    1. 给我来自insertSpecial 平台编码的字节
    2. 从字节创建一个新的字符串,告诉字节是 UTF-8(即使字节是之前在平台编码中获得的)

    我已经多次看到这段代码,不幸的是它只会破坏一些东西。这是完全没有必要的,即使写得正确,它也不会“转换”任何东西。如果平台编码不是UTF-8,那么它很可能会破坏任何特殊字符(如果平台编码与 String 构造函数中给定的编码之间存在适当差异,则甚至会破坏整个字符串)。

    问号是无法转换的字符的占位符,意味着它永远消失了。

    这里有一些阅读,所以你不会再犯这个错误:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

    【讨论】:

    • 基本上问题出在 cron 作业上。当我们手动测试它时,编码是“UTF-8”并且一切正常。但我们不知道,默认情况下从 cron 作业运行时,它会采用不同的编码。现在,在脚本运行后,我们发现了这个问题,并且由于我们不再有输入文本而无法恢复。
    • 嗯,根本问题是不理解编码。我之前曾多次看到相同的new String(insertSpecial.getBytes(), "UTF-8"); 行,我想知道您是从哪里想到的?它永远行不通,为什么这么多人尝试呢?
    猜你喜欢
    • 1970-01-01
    • 2017-11-04
    • 2015-11-16
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多