你说你是这样取的:
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.