取消转义并转换字符串编码

发布于 2025-01-02 19:57:57 字数 582 浏览 0 评论 0原文

我必须在 Java 中将 String 解析为 Date 对象。 我得到的字符串遵循模式 MMM d yyyy HH:mm:ss z ,区域设置设置为 French

由于法国口音的编码,当日期为二月、八月或十二月时,会出现此问题。例如,我得到déc。 15 2011 16:55:38 CET 2011 年 12 月 15 日。

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

现在我使用:

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

它有效,因为法语月份中唯一的重音是 éû 但有没有更干净的方法来取消转义和转换字符?

I have to parse a String to a Date object in Java.
The string I get following the pattern MMM d yyyy HH:mm:ss z with locale set to French.

The problem occures when the date is in february, august or december due to encoding of french accents. For example, I get déc. 15 2011 16:55:38 CET for december 15th 2011.

I can't change the way the string is created so I have to deal with the bad encoding on my side. It seems that when generated the string is badly encoded (UTF-8 content encoded as ISO 8859-1) then escapde.

For now I use :

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

It works because the only accent in french month are é and û but is there a cleaner way to unescape and convert characters?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梨涡少年 2025-01-09 19:57:57

您需要两个步骤:

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

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

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

You need two steps:

  1. Resolve numeric character references, for example, using StringEscapeUtils as suggested by Andy:

    String unescaped = StringEscapeUtils.unescapeHtml(in);
    
  2. Fix encoding by treating characters as UTF-8 code units:

    String out = new String(unescaped.getBytes("ISO-8859-1"), "UTF-8");
    
黯然#的苍凉 2025-01-09 19:57:57

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

来自 StringEscapeUtils.unescapeHtml 的 JavaDoc

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

例如,字符串“<Français>”将变成“

它还应该适用于您输入中的数字实体。

You could use Apache Commons StringEscapeUtils to do this if you don't mind that dependency.

From the JavaDoc for StringEscapeUtils.unescapeHtml:

Unescapes a string containing entity escapes to a string containing
the actual Unicode characters corresponding to the escapes. Supports
HTML 4.0 entities.

For example, the string "<Français>" will become "<Français>"

It should also work with numeric entities like you have in your input.

冷夜 2025-01-09 19:57:57

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

所以按照@axtavt的建议,我使用了 StringEscapeUtils,但为了做到这一点,我将此依赖项添加到了我的 gradle 中:

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

并通过以下方式修复了角色问题

return StringEscapeUtils.unescapeHtml3(word);        

Just in case someone else is looking for the same solution as me. I was trying to decode characters that I got from okhttp (android) requests like:
à to Ã

So as suggested by @axtavt, I used StringEscapeUtils, but to do so I added this dependency to my gradle:

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

And fixed character issues by

return StringEscapeUtils.unescapeHtml3(word);        
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文