无法解码使用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"
答案 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,因此这不是问题。
您看到的是’
之类的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
之类的字符串。