【问题标题】:decoding issue with diacritic characters变音符号的解码问题
【发布时间】:2018-08-23 08:09:38
【问题描述】:

下面这两个字符串有什么区别?当我解码第一个字符串时,它工作正常,我可以看到变音符显示得很好。

String val = "m%C3%B6torhead album";
String decodedVal = URLDecoder.decode(val, StandardCharsets.UTF_8);

但是当我尝试解码下面的字符串时,我看不到变音符号工作正常。

String val = "m%EF%BF%BDtorhead album";
String decodedVal = URLDecoder.decode(val, StandardCharsets.UTF_8);

谁能告诉我这里出了什么问题?这些字符串是我们从上游获取的,因此我们无法控制。

【问题讨论】:

  • 字符也必须在使用的字体中可用才能看到它们。您所说的“看不到变音符号工作正常”到底是什么意思?

标签: java string utf-8 character-encoding


【解决方案1】:

第二个序列解码为 U+FFFD REPLACEMENT CHARACTER,用于替换传入的字符,该字符的值在 Unicode 中未知或无法表示。

这意味着您可能会看到类似的内容。

您无法在客户端上解决此问题,问题出在服务器上,需要在那里解决。

【讨论】:

  • 原因是转换失败,例如粘贴文本:Mœtorhead 纯拉丁语 1 (ISO-8859-1),因为 ISO-8859-1 中不存在 œ,但是在 Windows-Latin-1 又名 (Cp-1252) 中。这里可能就是这种情况,尽管我认为是摩托头。 (请注意,浏览器将 ISO-8859-1 解释为 Cp-1252,因此服务器端处理实际上应该将 Cp-1252 用于客户端 ISO-8859-1。)
【解决方案2】:

%C3%B6 是字符 ö 的有效编码值,因此“m%C3%B6torhead album”值可以完美解码。 在第二种情况下,“%EF%BF%BD”对于 UTF-8 编码中的任何字符集都不是有效的编码值,因此它不会对其进行解码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 2016-05-03
    • 2018-09-06
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多