【问题标题】:Special Characters issue in server response服务器响应中的特殊字符问题
【发布时间】:2015-01-14 09:21:50
【问题描述】:

当我向服务器请求(GET)内容时,我能够得到如下响应: K??

但实际内容是:KòÉ

为了解决这个问题,我在保存和读取文件内容时尝试使用 UTF-8 格式,如下所示:

//保存内容

   OutputStreamWriter sout = new OutputStreamWriter (new FileOutputStream(new File(path)),Charset.forName("UTF-8"));

   BufferedWriter buff_out= new BufferedWriter(sout); 

    int line = 0;
    while((line = buff_in.read()) != -1) 
            buff_out.write(line);

//读取内容

    InputStream inputStreamRead = new FileInputStream(path);
    StringBuilder stringBuilder = null;

    InputStreamReader inputStreamReader = new InputStreamReader(inputStreamRead, Charset.forName("UTF-8"));
    BufferedReader buffReader= new BufferedReader(inputStreamReader);

    String line;
    stringBuilder = new StringBuilder();
    try 
    {
        while (( line = buffReader.readLine()) != null) 
        {
            stringBuilder.append(line);
            stringBuilder.append('\n');
        }
        Log.d("Main", "Test:: "+stringBuilder.toString());
    } 

借助上述逻辑,我不可能得到像KòÉ那样的实际内容。

我也尝试过读取字节。谁能帮我解决这个问题。

提前致谢。

【问题讨论】:

    标签: java android unicode character-encoding fileoutputstream


    【解决方案1】:

    您可以尝试删除它
    跨越跨越 = Html.fromHtml(stringBuilder.toString(), this, null); 尝试打印跨越的文本。

    【讨论】:

      【解决方案2】:

      假设close() 被正确调用,您的代码工作正常。 有人可能会使用 try-with-resources:

      try (BufferedWriter buff_out = new BufferedWriter(new OutputStreamWriter(
              new FileOutputStream(new File(path)), StandardCharsets.UTF_8))) { 
          ...
      } // Automatic close
      

      也可以使用:

      String path = ...
      byte[] content = Files.readAllBytes(Paths.get(path));
      String s = new String(content, StandardCharsets.UTF_8);
      

      对 JavaSE 分发中的标准可用 CharSet 使用 StandardCharsets 常量意味着您不需要处理 UnsupportedEncodingException(UTF-8 始终可用)。

      错误来自另一个来源。控制台(IDE 或操作系统命令行)可能使用平台编码,并且可能无法转换那些 Unicode 字符。

      使用功能强大的程序员编辑器编辑文件,例如免费的 NotePad++ (Windows) 或 JEdit。 他们可以处理编码。

      你也可以做一个字节转储来检查显示的?是否确实是字符串中的问号:

      System.out.println(Arrays.toString(string.getBytes(StandardCharsets.UTF_8)));
      System.out.println(string.contains("?"));
      

      未显示的服务器通信似乎是罪魁祸首,服务器应将编码设置为 UTF-8,客户端使用标头进行获取

      Accept-Encoding: UTF-8
      

      并以 UTF-8 格式读取响应。这可以通过浏览器中的手动 URL 进行测试。检查 HTML 源代码以查看 Unicode 是否未作为实体 (&12345;)。

      【讨论】:

      • 谢谢乔普·埃根。我已经按照您的建议进行了尝试,但仍然遇到同样的问题。我会尝试,如果有的话会更新。
      猜你喜欢
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      相关资源
      最近更新 更多