Java unicode 奇怪的行为
Java unicode strange behaviour
我正在使用 HttpURLConnection 向 Twitter 的 API 发出请求。 API returns a json 所有数据都使用 UTF-8 编码(您可以在响应的 headers 中看到)。我在 .jsp (html).
中显示数据
我用这段代码读取了响应(json):
BufferedReader in = new BufferedReader(new InputStreamReader(http.getInputStream(),"UTF-8"));
String inputLine;
StringBuffer res = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
// Append line to 'res', so I can have a string with all the json
res.append(inputLine);
// Print the line for debugging
System.out.println(inputLine);
}
in.close();
现在,问题来了。 json 中的一些值(现在只是一个字符串)是表情符号,因此它们应该表示为 unicode 字符。这正是正在发生的事情,至少对他们中的一些人来说是这样。这是一个带有用户名的示例:
推特原文:
我从 API 的回复中得到了什么:
"name":"\uD83C\uDF52UserName"
最后是怎么显示在.jsp:
用这个表情符号效果很好。显示的名称与在 Twitter 中显示的名称相同。但是看看下面推文的文字。就好像 unicode 重复了,但第二个没有显示,或者有些奇怪。请注意,在 eclipse 的控制台中,您会看到 ??
,但是当它加载 .jsp 时,表情符号会按应有的方式显示。这不是问题,我猜这只是控制台的编码(尽管这表明该 unicode 有问题,因为在第一个示例中它显示了 unicode,而不是 ??
)。
推特推文原文:
我从 API 的回复中得到了什么:
"text":"?? Segons l'U.S。司法部,其他婴儿的 crien sense pare son:\n\n?? 63% de suïcidis.\n?? 90% d'indigents。\n?? 85% de desordres en el comportament。\n?? 71% de l'abandonament escolar。\n?? 70% de les detencions juvenils。\n?? 75% d'abús de drogues.\n?? 75% dels violadors."}
最后是怎么显示在.jsp:
表情符号显示正确,但后面总是有一个?
,我不知道为什么。
此外,我应该提到,在.jsp 中,为了显示将 unicode 转换为 html-compatible-code,我使用 this library。你可以在这里看到使用方法将 unicode 解析为十六进制和不使用它之间的区别:
知道这里发生了什么吗?
提到的表情是:(U+1F352) ♦️(U+2666) ❗️(U+2757)
想通了。 ?
是十进制的字符 65039
,所以我所做的就是用 space 替换该字符。现在表情符号显示如我所愿,后面没有那个符号。
String strFinal = res2.toString().replace((char)65039, ' ');
我正在使用 HttpURLConnection 向 Twitter 的 API 发出请求。 API returns a json 所有数据都使用 UTF-8 编码(您可以在响应的 headers 中看到)。我在 .jsp (html).
中显示数据我用这段代码读取了响应(json):
BufferedReader in = new BufferedReader(new InputStreamReader(http.getInputStream(),"UTF-8"));
String inputLine;
StringBuffer res = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
// Append line to 'res', so I can have a string with all the json
res.append(inputLine);
// Print the line for debugging
System.out.println(inputLine);
}
in.close();
现在,问题来了。 json 中的一些值(现在只是一个字符串)是表情符号,因此它们应该表示为 unicode 字符。这正是正在发生的事情,至少对他们中的一些人来说是这样。这是一个带有用户名的示例:
推特原文:
我从 API 的回复中得到了什么:
"name":"\uD83C\uDF52UserName"
最后是怎么显示在.jsp:
用这个表情符号效果很好。显示的名称与在 Twitter 中显示的名称相同。但是看看下面推文的文字。就好像 unicode 重复了,但第二个没有显示,或者有些奇怪。请注意,在 eclipse 的控制台中,您会看到 ??
,但是当它加载 .jsp 时,表情符号会按应有的方式显示。这不是问题,我猜这只是控制台的编码(尽管这表明该 unicode 有问题,因为在第一个示例中它显示了 unicode,而不是 ??
)。
推特推文原文:
我从 API 的回复中得到了什么:
"text":"?? Segons l'U.S。司法部,其他婴儿的 crien sense pare son:\n\n?? 63% de suïcidis.\n?? 90% d'indigents。\n?? 85% de desordres en el comportament。\n?? 71% de l'abandonament escolar。\n?? 70% de les detencions juvenils。\n?? 75% d'abús de drogues.\n?? 75% dels violadors."}
最后是怎么显示在.jsp:
表情符号显示正确,但后面总是有一个?
,我不知道为什么。
此外,我应该提到,在.jsp 中,为了显示将 unicode 转换为 html-compatible-code,我使用 this library。你可以在这里看到使用方法将 unicode 解析为十六进制和不使用它之间的区别:
知道这里发生了什么吗?
提到的表情是:(U+1F352) ♦️(U+2666) ❗️(U+2757)
想通了。 ?
是十进制的字符 65039
,所以我所做的就是用 space 替换该字符。现在表情符号显示如我所愿,后面没有那个符号。
String strFinal = res2.toString().replace((char)65039, ' ');