字符串编码不输出所有字符

时间:2012-04-14 11:02:49

标签: java android html encoding

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

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

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

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

谢谢!

周末愉快!

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

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

1 个答案:

答案 0 :(得分:1)

你说你是这样的:

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

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

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


在反思时,虽然你应该注意服务器返回的内容类型,但真正的问题要么是你编写* .txt文件的方式,要么是显示奇怪字符的显示工具。< / p>

  • 目前尚不清楚用于编写文件的编码。也许你选错了。
  • 显示工具可能假设文件具有不同的编码。也许它检测到文件是UTF-8或UTF-16是否有BOM。
  • 显示工具可能是破损的,并且不了解不间断的空间。

当您使用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。