我的客户端使用InputStreamReader / BufferedReader从Internet获取文本。 但是,当我将文本保存为* .txt时,文本会显示额外奇怪的特殊符号,例如'Â'。
我已经尝试将字符串转换为ASCII,但是我使用的是uppå,ä,ö,Ø。
我尝过食物= food.replace("Â", ""); and IndexOf();
但是字符串不会找到它。但它在HEX编辑器中。
总结:当我使用text.setText
(Android)时,输出看起来很好,没有奇怪的符号,但是当我将文本保存到* .txt时,我得到大约4个'''。我不想要ASCII,因为我使用其他非ASCII字符。
“”在我的Android和记事本中显示为空白。
谢谢!
周末愉快!
编辑: 通过删除所有非破坏空间来解决它:
myString.replaceAll("\\u00a0"," ");
答案 0 :(得分:1)
你说你是这样的:
in = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8"));
您获取的内容很可能不会以UTF-8编码。
您需要在HttpURLConnection对象上调用getContentType()
,如果它为非null,则在创建InputStreamReader
时提取编码并使用它。如果响应未提供具有有效编码的内容类型,则仅假设为“UTF-8”。
在反思时,虽然你应该注意服务器返回的内容类型,但真正的问题要么是你编写* .txt文件的方式,要么是显示奇怪字符的显示工具。< / p>
当您使用HEX编辑器显示文件时,很可能使用8位字符集来呈现字节,并且该字符集很可能是Latin-1。但显然,该文件实际编码方式不同。
无论如何,替换不间断空间的方法是(IMO)一个黑客攻击,它不会处理你将来可能遇到的其他东西。因此,我建议您花时间真正了解问题,并正确修复。
最后,我想我明白为什么你可能会得到角色。 Unicode NON-BREAKING-SPACE字符为u00a0
。当您将其编码为UTF-8时,您将获得C2 A0。但是Latin-1中的C2是CAPITAL-A-CIRCUMFLEX,而Latin-1中的A0是非突发性空间。因此,“混淆”很可能是您的程序正在以UTF-8编写* .txt文件,该工具将其读作Latin-1。