簡體   English   中英

Java unicode 奇怪的行為

[英]Java unicode strange behaviour

我正在使用 HttpURLConnection 向 Twitter 的 API 發出請求。 API 返回一個 json,其中包含所有用 UTF-8 編碼的數據(您可以在響應的標頭中看到)。 我在 .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'US Department of Justice, els infants que es crien sense pare són:\\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,我使用了這個庫 您可以在這里看到使用該方法將 unicode 解析為十六進制與不使用它的區別:

在此處輸入圖片說明

在此處輸入圖片說明

知道這里發生了什么嗎?

提到的表情符號是:🍒(U+1F352) ♦️(U+2666)❗️(U+2757)

弄清楚了。 那個? 是十進制的字符65039 ,所以我所做的是用空格替換該字符。 現在表情符號按照我的意願顯示,后面沒有那個符號。

String strFinal = res2.toString().replace((char)65039, ' ');

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM