2

我的客户端使用 InputStreamReader/BufferedReader 从 Internet 获取文本。但是,当我将文本保存到 *.txt 时,文本会显示额外的奇怪特殊符号,例如“”。

  • 我已经尝试将字符串转换为 ASCII,但是我使用的 å,ä,ö,Ø 搞砸了。

  • 我试过食物 =food.replace("Â", ""); and IndexOf(); 但字符串找不到。但它在 HEX 编辑器中。

所以总结:当我使用text.setText(Android)时,输出看起来很好,没有奇怪的符号,但是当我将文本保存到 *.txt 时,我得到了大约 4 个“”。我不想要 ASCII,因为我使用其他非 ASCII 字符。'Â' 在我的 Android 和记事本中显示为空白。

谢谢!

周末愉快!

编辑:通过删除所有非破坏空间来解决它:

myString.replaceAll("\\u00a0"," ");
4

1 回答 1

1

你说你是这样取的:

in = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8")); 

您获取的内容很有可能没有以 UTF-8 编码。

您需要调用getContentType()HttpURLConnection 对象,如果它不为 null,请提取编码并在创建InputStreamReader. 如果响应未提供具有有效编码的内容类型,则仅假定为“UTF-8”。


仔细想想,虽然您应该注意服务器返回的内容类型,但真正的问题要么在于您编写 *.txt 文件的方式,要么在于显示奇怪字符的显示工具。

  • 目前尚不清楚您使用什么编码来写入文件。也许你选错了。
  • 显示工具可能假设文件具有不同的编码。也许它检测到文件是 UTF-8 或 UTF-16 是否有 BOM。
  • 显示工具可能是完全损坏的,并且不理解不间断的空格。

当您使用 HEX 编辑器显示文件时,很可能使用 8 位字符集来呈现字节,并且该字符集很可能是 Latin-1。但显然,该文件实际上编码不同。

无论如何,替换不间断空格的方法是(IMO)一种hack,它不会处理您将来可能遇到的其他东西。因此,我建议您花时间真正了解问题,并正确解决问题。


Finally, I think I understand why you might be getting  characters. A Unicode NON-BREAKING-SPACE character is u00a0. When you encode that as UTF-8, you get C2 A0. But C2 in Latin-1 is CAPITAL-A-CIRCUMFLEX, and A0 in Latin-1 is NON-BREAKING-SPACE. So the "confusion" is most likely that your program is writing the *.txt file in UTF-8 and the tool is reading it as Latin-1.

于 2012-04-14T11:34:42.807 回答