我正在尝试将UTF-8解码为String,但是某些特殊字符没有被解码(“和”),而是显示为?问号

时间:2019-01-08 13:57:09

标签: java utf-8

无法解码使用UTF-8编码的

使用以下代码:

String displayString = inItem.GetDisplayString();
displayString = new String(displayString.getBytes(), "UTF-8");

示例String如下:

"Platinum Stars’ 4-0 ravishing of Black Leopards only but did Ajax a colossal"

2 个答案:

答案 0 :(得分:0)

  

’在解码时显示[在处理URLDecoder.decode(displayString, "UTF-8");时用“The job is not done yet.

那很正常。

字符是Unicode左双引号(U+2019),而不是U + 0022引号。具体来说,它不是ASCII字符,因此,URLDecoder.decode将其转换为HTML实体表示形式。

对于"’"字符,它是右单引号(U+2019)。此处再次超出了ASCII范围,并且并非所有终端都能正确显示它。特别是,默认代码页850下的Windows控制台不能。

当然,因为它们都具有255以上的Unicode代码,所以无法用Latin1或ISO-8859-1表示。。。

答案 1 :(得分:0)

现在首先:java String将在内部使用Unicode,因此这不是问题。

您看到的是&#x2019;之类的HTML实体,这些实体将源于某些转换。可能是来自HTML表单的数据,其中的表单元素没有:<form accept-charset="UTF-8">或页面不在UTF-8中。

一个人可以修复。可以使用EscapeUtils.unescapeHTML或Java> 9中常用的apache:

s = s.replaceAll("\\&#(\\d{1,7}|x[0-9A-Fa-f]{1,6});",
        new String(new int[] {
            mr -> Integer.decode(mr.group(1).replace("x", "0x"))
        }, 0, 1));

这会将数字(可能是十六进制)的实体转换为Unicode值。

在Java 9之前:

Pattern pattern = Pattern.compile("\\&#(\\d{1,7}|x[0-9A-Fa-f]{1,6});");
Matcher m = pattern.matcher(s);
StringBuffer sb = new StringBuffer();
while (m.find()) {
    m.appendReplacement(sb, new String(new int[] {
            mr -> Integer.decode(m.group(1).replace("x", "0x"))
        }, 0, 1));
}
m.appendTail(sb);
s = sb.toString();

整数解码处理诸如十进制64(字符@)或十六进制0x52BA之类的字符串。