java - 无法解析和显示从 http 请求中读取的非 utf8 字符

标签 java json parsing encoding

我正在使用 Java 来解析这个请求

http://ajax.googleapis.com/ajax/services/search/web?start=0&rsz=large&v=1.0&q=rz+img+news+recordid+border

结果是这个(为了简洁起见被截断了)JSON 文件:

{"responseData":{"results":
<...>
"visibleUrl":"www.coolcook.net",
"cacheUrl":"http://www.google.com/search?q\u003dcache:p4Ke5q6zpnUJ:www.coolcook.net",
"title":"مطبخ مطايب - كباب الدجاج والخضار بصلصة الروب",
"titleNoFormatting":"مطبخ مطايب - كباب الدجاج والخضار بصلصة الروب","\u003drz+img+news+recordid+border"}}, 
<...>
"responseDetails": null, "responseStatus": 200}

我的问题在于返回的阿拉伯字符(可能是任何非 unicode 字符)。我尝试使用类似的方法将它们转换回 unicode:

JSONArray ja = json.getJSONObject("responseData").getJSONArray("results");
JSONObject j = ja.getJSONObject(i);
str = j.getString("titleNoFormatting");
logger.log("before: " + str); // this is just my version of println
enc_str = new String (str.getBytes(), "UTF8");
logger.log("after: " + enc_str);

但是,“之前”和“之后”的结果是相同的:一组 ?????,无论我是在服务器日志文件中还是在 HTML 页面中输出它们。有没有另一种方法可以取回阿拉伯字符并将它们输出到网页中?

JSON 是否具有针对此类问题的任何支持功能,也许是为了直接从 JSONObject 读取非 utf 字符?

最佳答案

您遇到的问题很可能是由于您在阅读来自 google 的 http 响应时字符编码设置不正确造成的。你能发布实际获取 URL 并将其解析为 JSON 对象的代码吗?

例如运行以下命令:

public class Test1 {
  public static void main(String [] args) throws Exception {

    // just testing that the console can output the correct chars
    System.out.println("\"title\":\"مطبخ مطايب - كباب الدجاج والخضار بصلصة الروب");

    URL url = new URL("http://ajax.googleapis.com/ajax/services/search/web?start=0&rsz=large&v=1.0&q=rz+img+news+recordid+border");
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    InputStream is  = connection.getInputStream();

    // the important bit is here..........................\/\/\/
    InputStreamReader reader = new InputStreamReader(is, "utf-8");


    StringWriter sw = new StringWriter();

    char [] buffer = new char[1024 * 8];
    int count ;

    while( (count = reader.read(buffer)) != -1){
      sw.write(buffer, 0, count);
    }

    System.out.println(sw.toString());
  }
}

这是使用自古以来就存在的相当丑陋的标准 URL.openConnection()。如果您使用类似 Apache httpclient 的东西那么您就可以非常轻松地做到这一点。

有关编码的一些背景知识,以及为什么 new String (str.getBytes(), "UTF8"); 永远无法工作的解释,请阅读 Joel's article on unicode

关于java - 无法解析和显示从 http 请求中读取的非 utf8 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1743935/

相关文章:

java - 使用 gzip 压缩组件 - Java EE

mysql - 无法在查询中提取 JSON 路径

java - 无法使用 HTMLCleaner 解析 HTML

c# - 解析 C#,查找方法并将 try/catch 放入所有方法

json - Flutter - 如何将嵌套的 json 解析为具有泛型的类?

java - 自动人类可读时间间隔

java JLabel 在 90 度旋转后无法正确重新绘制调整大小的标签

javascript - lodash "get"和 "if else"子句之间的性能差异

javascript - map 未使用 d3.js 加载?

java - 在 Eclipse 上手动安装 subclipse