将编码转换为UTF-8。对字符进行编码,例如将ö编码为ö。

3

我想在Android中将字符串编码为UTF-8。例如,这个字符串:

Grüne Ähren beißen Flöhe

to

Grüne Ãhren beiÃen Flöhe

但无论我做什么,我都将ü编码为ü或ü编码为%C3%BC(在线通常称为“原始URL编码”)。

找到了将其转换为byte[]或URI.toASCIIString()的解决方案。但是它们对我都不起作用。

更新

我正在参加eBay合作伙伴网络,并尝试将搜索词连接到我的合作伙伴网址。 eBay的人们必须使用错误的字符集,因为UTF-8 URL编码字符串不起作用。

UTF-8 URL编码的搜索词

(Grüne Ähren beißen Flöhe

变为

Gr%C3%BCne%20%C3%84hren%20bei%C3%9Fen%20Fl%C3%B6he)

在eBay搜索框中会得到这样的结果:

Wrong encoding in eBay searchbox

如果我使用ISO_8859_1编码我的搜索词,则可以正常工作(Grüne Ãhren beiÃen Flöhe):

Right encoding in eBay searchbox

非常感谢社区的支持


4
你需要了解,将“Grüne Ähren beißen Flöhe”编码为 utf-8 后仍然是“Grüne Ähren beißen Flöhe”。假设该文本以文本字节的形式存储,那么底层字节可能会不同。 - kumesana
4
我觉得你不理解这里发生了什么。UTF-8有自己的编码字符到字节的方式。如果你使用UTF-8将ö转换成其2个字节表示形式(C3 B6),并且同样使用UTF-8将其转换回字符,那么它仍然是ö。如果你使用UTF8将其转换为字节,但使用通常情况下不想使用的ISO-8859-1将其转换回来,你会得到你想要的ö - f1sh
感谢@kumesana的评论。完全正确。我被在线转换器误导,告诉我这个编码是UTF-8(例如链接)。但问题仍然存在。如何将Umlauts等转换为这些神秘字符? - S. Gissel
2
@f1sh已经提到了,通常情况下你不希望发生这种情况。我可以问一下你打算做什么吗?模拟使用错误编码读取的文本数据? - bkis
听起来你遇到了一个终端(很可能是在 Windows 上)它配置了错误的字符集,当 UTF-8 被打印时,你看到了特殊字符的不正确表示。解决方案是正确地配置终端。 - chrylis -cautiouslyoptimistic-
显示剩余2条评论
1个回答

4
您希望做的是将字符串按UTF-8转换为字节表示,并使用不同的字符集(如ISO-8859-1)来解释这些字节。
通常,这是许多问题的根源。您想有意地做大多数开发人员做得不正确的事情(或者他们简单地忽略了字符集的问题)。
既然您只需要它能正常工作,那么请使用以下代码:
byte[] bytes = "Grüne Ähren beißen Flöhe".getBytes("UTF-8");
String result = new String(bytes, "ISO-8859-1");

在这里可以看到它的运行效果,链接


当然,结果是垃圾。并且依赖于ISO-8891-1来表示特殊字符,而在ISO-8891-13中可能会有所不同。 - Joop Eggen
3
@JoopEggen,从技术上讲,OP确实问了如何获取那个垃圾东西。 - kumesana
@kumesana 是的,我并不是想要批评,只是再次说明这个结果并没有什么用处,除了检查 UTF-8 格式的文件是否被 ISO-8859-1 读取导致出现错误。 - Joop Eggen
1
@f1sh非常感谢您对我的问题进行澄清。 - S. Gissel
将字节编码为字符是一件事。Base64是一种非常常见的方法。它也很容易记录。不幸的是,有些人使用ISO 8859-1编码的反向来达到同样的目的。我称之为Base256编码。它的一个大问题是经常被误认为是纯文本或者看作乱码,而且很少有人记录它的真实含义。 - Tom Blodget

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