恢复错误编码的字符(Java)

恢复错误编码的字符(Java),java,encoding,utf-8,Java,Encoding,Utf 8,我们在Linux中使用cron运行了一些java代码,以在生产数据库中保存数千条记录。该框中的区域设置字符映射为“ANSI_X3.4-1968”。现在,在将它们持久化到数据库之前,我们采取了以下步骤。 1.在文本上使用StringEscapeUtils.unescapethml4 2.以UTF-8格式写入字符串并保存在数据库中 现在的问题是在这些步骤之后,特殊字符显示为“?”。是否可以将其还原为原始角色? 我用以下步骤模拟了这个问题 将Eclipse编码更改为“ANSI_X3.4-1968” 写

我们在Linux中使用cron运行了一些java代码,以在生产数据库中保存数千条记录。该框中的区域设置字符映射为“ANSI_X3.4-1968”。现在,在将它们持久化到数据库之前,我们采取了以下步骤。 1.在文本上使用StringEscapeUtils.unescapethml4 2.以UTF-8格式写入字符串并保存在数据库中

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

  • 将Eclipse编码更改为“ANSI_X3.4-1968”
  • 写下面几行代码

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

    基本上没有。您在
    新字符串(insertSpecial.getBytes(),“UTF-8”)中犯了最大的错误
    再次表明字符编码令人惊讶地难以处理

    这段代码的作用是,一步一步:

  • 给我平台编码中的
    insertSpecial
    中的字节
  • 从字节中创建一个新字符串,告知字节是UTF-8(即使这些字节是刚刚在平台编码中获得的)
  • 这个代码我已经看过好几次了,不幸的是它只会破坏一些东西。这是完全不必要的,即使写得正确,也不会“转换”任何内容。如果平台编码不是
    UTF-8
    ,那么它很可能会破坏任何特殊字符(甚至整个字符串,如果平台编码与字符串构造函数中给出的编码之间存在适当的差异)

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


    下面是一些阅读材料,这样你就不会再犯这样的错误了:

    基本上问题出在cron作业上。当我们手动测试时,编码是“UTF-8”,一切正常。但我们不知道,默认情况下从cron作业运行时,它将采用不同的编码。现在,在脚本运行之后,我们发现了这个问题,并且无法恢复,因为我们不再有输入文本了。嗯,根本问题是不理解编码。我见过同样的
    新字符串(insertSpecial.getBytes(),“UTF-8”)行几次之前,我想知道你从哪里想出它?它永远不会起作用,那么为什么这么多人在尝试呢?
    
    
    
    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);