如何/无法将乱码/奇怪的文本转换为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不是中文字符的有效编码。

所以似乎正在发生的事情是服务器正在错误地存储文本,并在此过程中将其弄乱…然后使用不正确/不适当的编码类型提供服务。

真是一团糟!