4

è¼å¥从 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");

以上都给出相同的输出:è¼å¥

那么,请谁能帮我理解我做错了什么?或者请给我任何替代方案?

任何帮助都感激不尽。谢谢

4

3 回答 3

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显示原始文本

于 2013-08-17T06:53:14.450 回答
1

首先要做的是检查响应的 Content-Type 标头,以查看远程服务器在响应中使用的编码。如果它什么也没说,那么很可能它使用的是 ISO-8859-1(又名 Latin-1)而不是 UTF-8。

另一种可能性是服务器正在发送二进制数据……您根本不应该尝试将其显示为文本。

如果您告诉我们您期望文本的外观会有所帮助。


假设它是 latin-1 文本,那么您需要像这样解码它:

String str = new String(s.getBytes(), "ISO8859_1");

请注意,您在这里实际尝试做的是将字节编码转换Java 的本机字符串表示,其中字符有效地以 UTF-16 表示。


我也注意到你说原文应该是汉字。如果是这样,那恐怕真正的问题出在服务器端。Latin-1 不是中文字符的有效编码。

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

真是一团糟!

于 2013-08-17T06:21:58.227 回答
1

我没有评论如何在 Java 代码中正确获取 UTF-8 字符。因为你几乎尝试过不同的东西,我相信其中一种应该适合你。但我想帮助您了解如何正确验证您的不同代码更改。

好的,根据您的评论

我正在通过 sysouts 打印它,它也在 Log 和 Toast 中显示,我的控制台可以显示我已经测试过的文本!

这些方法的问题在于您需要确保输出源是 UTF-8 编码的。控制台的问题在于默认情况下它不是 UTF-8 编码的。因此,当您在代码中尝试不同的方式时,控制台将无法正确打印 UTf-8 数据,因此您将永远无法正确验证代码。

如果您使用的是 eclipse android sdk,那么有一种方法可以转换控制台的编码。这是您的操作方法:

运行配置 -> 通用 -> 编码(选择 UTF-8)

于 2013-08-17T06:22:24.523 回答