如何/无法将乱码/奇怪的文本转换为utf-8 android(java)?
我有一个乱码文本è¼å¥
,它是从MySql提取的Web服务(php)返回的
现在我正在尝试将其解码为android中的utf-8,但它无法正常工作
我试过了:
String s = "è¼å¥";// text returned by web service taking it as static for testing
1.不工作:
String str = new String(s.getBytes(), "utf-8");
2.不工作:
String normalized = Normalizer.normalize(str, Normalizer.Form.NFD); // also tried NFC, NFKC, NFKD // also tested by isNormalized its returning true
3.不工作:
String str =URLDecoder.decode(s, "utf-8");
以上都给出了相同的输出: è¼å¥
那么,请任何人帮助我理解我做错了什么? 或者请提供任何替代方案?
任何帮助都感激不尽。 谢谢
正如斯蒂芬C解释得非常好,我遵循了所有这些步骤,但几乎不需要进行其他更改:
1.正如Stephen C所解释的那样,我的服务器正在使用Latin-1
encoding
发送数据,所以我必须使用ISO8859_1
charset
2.我正在尝试String str = new String(s.getBytes(), "utf-8");
这不适用于Latin-1 encoded
数据!
所以为此我必须将charset
(对于我的情况ISO8859_1
)的数据设置为getBytes(" ISO8859_1")
所以现在工作正常
String str = new String(s.getBytes("ISO-8859-1"), "utf-8");
注意第二个参数是针对新字符串的字符集,因此it must be utf-8
才能显示原始文本
我不是在评论如何在java代码中正确获取UTF-8字符。 因为你几乎尝试了不同的东西,我相信其中一个应该适合你。 但我想帮助您正确validation不同的代码更改。
好的,根据你的意见
我正在通过sysouts打印它也在日志和Toast中显示它,我的控制台可以显示我已经测试过的文本!
任何这些方法的问题是您需要确保输出源是UTF-8编码的。 控制台的问题是它默认不是UTF-8编码的。 因此,当您在代码中尝试不同的方式时,控制台将无法打印UTf-8数据,因此您将永远无法正确validation代码。
如果您使用的是eclipse android sdk,那么有一种方法可以转换控制台的编码。 这是你如何做到的:
运行配置 – >通用 – >编码(选择UTF-8)
首先要检查响应Content-Type标头,以查看远程服务器在响应中使用的编码。 如果它什么也没说,那么它很可能是使用ISO-8859-1(又名Latin-1)而不是UTF-8。
另一种可能性是服务器正在发送二进制数据……您根本不应该尝试将其显示为文本。
如果您告诉我们您期望文本看起来像什么,这将有所帮助。
假设它是latin-1文本,那么你需要像这样解码它:
String str = new String(s.getBytes(), "ISO8859_1");
请注意,您实际上要做的是将字节编码转换为 Java的本机字符串表示forms,其中字符有效地以UTF-16表示。
我还注意到你说原文应该是汉字。 如果是这种情况,那么我担心真正的问题出在服务器端。 Latin-1不是中文字符的有效编码。
所以似乎正在发生的事情是服务器正在错误地存储文本,并在此过程中将其弄乱…然后使用不正确/不适当的编码类型提供服务。
真是一团糟!