Java Unescape和convert字符串编码
我必须在Java中将字符串解析为日期对象。 我得到的字符串遵循模式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
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
toaoût
toaoāt
。在服务器(Redhat5.4,Java1.6.0Ø21)上,值从août
toaoût
toaoï½t
@YCI:你确定这不是进一步处理的结果吗?尝试以十六进制打印此转换的结果,以排除可能的输出问题。你是对的,我的日志文件中有编码问题!结果表明,当只执行unescapethtml
而不使用新字符串(unescaped.getBytes(“ISO-8859-1”),“UTF-8”)重新编码字符串时,程序就可以工作代码>。这有点奇怪,但它是有效的。。。谢谢你的帮助!