服务器响应中的特殊字符问题

时间:2014-11-17 12:49:47

标签: java android unicode character-encoding fileoutputstream

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

但实际内容是: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òÉ。

我也试过读字节。任何人都可以帮助我解决这个问题。

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

假设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发行版中使用标准可用CharSets的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,客户端执行get with header

Accept-Encoding: UTF-8

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