Java Unescape和convert字符串编码

Java Unescape和convert字符串编码,java,date,encoding,utf-8,iso-8859-1,Java,Date,Encoding,Utf 8,Iso 8859 1,我必须在Java中将字符串解析为日期对象。 我得到的字符串遵循模式MMM d yyy HH:mm:ss z,语言环境设置为French 由于法语口音的编码,当日期为2月、8月或12月时会出现问题。例如,我得到déC2011年12月15日CET 16:55:38 我无法更改字符串的创建方式,因此我必须处理我这边的错误编码。似乎生成的字符串编码错误(UTF-8内容编码为ISO 8859-1),然后转义 目前我使用: stringFromXML = stringFromXML.re

我必须在Java中将字符串解析为日期对象。 我得到的字符串遵循模式
MMM d yyy HH:mm:ss z
,语言环境设置为
French

由于法语口音的编码,当日期为2月、8月或12月时会出现问题。例如,我得到
déC2011年12月15日CET 16:55:38

我无法更改字符串的创建方式,因此我必须处理我这边的错误编码。似乎生成的字符串编码错误(UTF-8内容编码为ISO 8859-1),然后转义

目前我使用:

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

它之所以有效,是因为法语月份唯一的重音是
é
ā
,但有没有更干净的方法来取消显示和转换字符?

如果您不介意这种依赖性,您可以使用Apache Commons StringEscapeUtils来实现这一点

从:

取消将包含实体的字符串转义为包含实体的字符串 与转义符对应的实际Unicode字符。支持 HTML4.0实体

例如,字符串“Franç;ais”将变为“”

它还可以处理输入中的数字实体。

您需要两个步骤:

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

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

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

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

    因此,正如@axtavt所建议的,我使用了
    StringEscapeUtils
    ,但为此,我在gradle中添加了此依赖项:

    compile 'org.apache.commons:commons-lang3:3.4'
    
    并通过

    return StringEscapeUtils.unescapeHtml3(word);        
    

    此解决方案在我的计算机上运行,但在服务器上我收到一个异常
    ,原因是:java.text.ParseException:Unparseable date:“aoèè½t 04 2011 16:55:38 CEST”
    。编码修复返回
    aoè½t
    而不是
    aoèt
    。知道这是从哪里来的吗?你确定输入是相同的吗?字符串是从XML文件中读取的。当我在文本编辑器中打开此XML时,编码标识为
    UTF-8,不带BOM
    。我从以下字段读取值:
    août 04 2011 16:55:38 CEST
    。在我的电脑(WindowsXP,Java1.6.0 t 11)上,值从
    août
    to
    août
    to
    aoāt
    。在服务器(Redhat5.4,Java1.6.0Ø21)上,值从
    août
    to
    août
    to
    aoï½t
    @YCI:你确定这不是进一步处理的结果吗?尝试以十六进制打印此转换的结果,以排除可能的输出问题。你是对的,我的日志文件中有编码问题!结果表明,当只执行
    unescapethtml
    而不使用
    新字符串(unescaped.getBytes(“ISO-8859-1”),“UTF-8”)重新编码字符串时,程序就可以工作。这有点奇怪,但它是有效的。。。谢谢你的帮助!