Unescape和转换字符串编码

时间:2012-02-06 10:27:02

标签: java date encoding utf-8 iso-8859-1

我必须在Java中将String解析为Date对象。 字符串MMM d yyyy HH:mm:ss z后面的字符串设置为French

由于法语口音的编码,日期是在二月,八月或十二月时出现问题。例如,我在2011年12月15日获得déc. 15 2011 16:55:38 CET

我无法改变字符串的创建方式,所以我必须处理我身边的错误编码。似乎生成时字符串编码严重(UTF-8内容编码为ISO 8859-1)然后转义。

现在我用:

stringFromXML = stringFromXML.replaceAll("é", "é");
stringFromXML = stringFromXML.replaceAll("û", "û");

这是有效的,因为法语月份中唯一的重音是éû,但有没有更清晰的方式来转换和转换字符?

3 个答案:

答案 0 :(得分:10)

您需要两个步骤:

  1. 解析数字字符引用,例如,使用Andy建议的StringEscapeUtils

    String unescaped = StringEscapeUtils.unescapeHtml(in);
    
  2. 通过将字符视为UTF-8代码单元来修复编码:

    String out = new String(unescaped.getBytes("ISO-8859-1"), "UTF-8");
    

答案 1 :(得分:2)

如果您不介意依赖,可以使用Apache Commons StringEscapeUtils来执行此操作。

来自JavaDoc for StringEscapeUtils.unescapeHtml

  

将包含实体转义符的字符串转义为包含的字符串   与转义对应的实际Unicode字符。支持   HTML 4.0实体。

     

例如,字符串“& lt; Fran& ccedil; ais& gt;”将成为“<Français>”

它也应该与您输入中的数字实体一起使用。

答案 2 :(得分:2)

以防其他人正在寻找与我相同的解决方案。我试图解码我从okhttp(android)请求中得到的字符,如: ÃÃ

正如@axtavt建议的那样,我使用了StringEscapeUtils,但为了这样做,我将这个依赖项添加到了我的gradle中:

compile 'org.apache.commons:commons-lang3:3.4'

通过

修复字符问题
return StringEscapeUtils.unescapeHtml3(word);