无法将乱码/奇怪的文本转换为UTF-8(Java - Android)?

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");

以上所有内容都是输出相同的:è¼å¥

那么,请问有人能帮助我理解我做错了什么吗? 或者请提供任何替代方法吗?

非常感谢任何帮助。


当你说“不工作”时,你是如何测试它的?通过编写sysout吗? - Juned Ahsan
@JunedAhsan 感谢您的评论!我通过 sysouts 打印它,也通过 Log 和 Toast 显示它,我的控制台可以显示我已经测试过的原始文本(即中文)! - Tarsem Singh
我应该将原始文本翻译成中文还是英文?请将字符粘贴到问题中。 - Stephen C
@StephenC 看看我的答案,我是如何解决这个问题的!非常感谢你的帮助!原始文本为:載。 - Tarsem Singh
3个回答

8
作为Stephen C非常好地解释了,我按照他的步骤做了一些额外的更改:
1.正如Stephen C所解释的那样,我的服务器正在使用Latin-1编码发送数据,因此我必须使用ISO8859_1字符集。
2.我试图使用“String str = new String(s.getBytes(),”utf-8“);”
这对Latin-1编码的数据无效!
因此,对于我的情况,我必须将数据的字符集(即ISO8859_1)设置为getBytes(“ ISO8859_1”)
现在这个问题已经得到解决。
String str = new String(s.getBytes("ISO-8859-1"), "utf-8");

请注意,第二个参数是新字符串的字符集,因此必须为utf-8才能显示原始文本。


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不是适用于中文字符的有效编码方式。因此,似乎正在发生的是服务器错误地存储了文本,并在过程中破坏了它...然后使用不正确/不适当的编码类型提供它。真是一团糟!

谢谢回答,你的意思是chartset应该是Latin-1的ISO-8859-1吗? - Tarsem Singh
Stephen C,我已经尝试了您更新的答案,现在它打印出了“还好”,看起来我们非常接近了! - Tarsem Singh

1
我不会评论如何在Java代码中正确获取UTF-8字符,因为你已经尝试了许多不同的方法,我相信其中一个应该适用于你。但是我想帮助你正确验证不同的代码更改。
好吧,根据你的评论
引用: 我通过sysouts打印它,也在日志和Toast中显示它,我的控制台可以显示我已经测试过的文本!
任何这些方法的问题在于,您需要确保输出源以UTF-8编码。控制台的问题在于它默认情况下不是UTF-8编码。因此,当您在代码中尝试不同的方式时,控制台将无法正确地打印UTf-8数据,因此您将永远无法正确验证代码。
如果您正在使用eclipse android sdk,则有一种方法可以转换控制台的编码。以下是如何操作:
运行配置->公共->编码(选择UTF-8)

谢谢,我已经完成了 Run Configuration -> Common -> Encoding (select UTF-8),但是我不确定数据库端的编码方式,让我检查一下! - Tarsem Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接