2012-04-14 80 views
2

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

  • 我试过把字符串转换成ASCII码,但是我使用的是混乱的upp,ä,ö,Ø。

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

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

谢谢!

周末愉快!

编辑: 通过删除所有非磨合空间解决了这个问题:

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

添加用于将值保存到文件的代码。 – 2012-04-14 11:04:56

+0

我使用FileWriter,但它没关系,因为如果我使用mString.replace(“”,“”);应该删除所有空间。但Android仍然显示“HEX编辑器”中的'''空白。 – AndroidXTr3meN 2012-04-14 11:07:15

回答

1

你说你是取这样的:

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

有一个公平的机会,东西你正在提取的文件不是以UTF-8编码的。

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


经过思考,而你要注意服务器返回的内容类型,真正的问题是无论是在你正在写的* .txt文件,或显示工具的方式,正显示出奇怪的人物。

  • 不清楚你用什么编码来编写文件。也许你选择了错误的一个。
  • 显示工具可能假定文件具有不同的编码。也许它检测到文件是UTF-8或UTF-16是否有BOM。
  • 显示工具可能被打断,并且不能理解非中断空格。

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

无论如何,取代非破坏空间的方法是(IMO)破解,它不会处理将来可能遇到的其他东西。所以我建议你花点时间来真正理解问题,然后妥善解决。


最后,我想我明白为什么,你可能会得到一个字符。 Unicode Non-Break-Space字符是u00a0。当你将它编码为UTF-8时,你会得到C2 A0。但Latin-1中的C2是CAPITAL-A-CIRCUMFLEX,而Latin-1中的A0是非破坏空间。因此,“混淆”很可能是您的程序以UTF-8编写* .txt文件,并且该工具正在将其读取为Latin-1。

+0

HTML: <!DOCTYPE html PUBLIC“ - // W3C // DTD XHTML 1.0 Strict // EN”“http://www.w3.org/ TR/xhtml1/DTD/xhtml1-strict.dtd“> < head profile =“http://dublincore.org/documents/dcq-html/”> \t AndroidXTr3meN 2012-04-14 11:35:59

+0

即便如此,您应该尊重响应标题。它返回什么contentType? – 2012-04-14 11:37:22

+0

我正在使用utf-8。你什么意思? – AndroidXTr3meN 2012-04-14 11:39:55