【问题标题】:Encode to UTF-8. Encode character eg. ö to ö编码为 UTF-8。编码字符,例如。 ö 到 ö¶
【发布时间】:2019-10-02 15:42:18
【问题描述】:

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

Grüne Ähren beißen Flöhe

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 搜索框中出现此结果:

如果我使用 ISO_8859_1 对搜索词进行编码,它可以工作 (Grüne Ãhren beiÃen Flöhe):

非常感谢社区

【问题讨论】:

  • 您需要了解将Grüne Ähren beißen Flöhe 编码为utf-8 仍将是Grüne Ähren beißen Flöhe。假设底层字节会有所不同,也就是说,如果有问题的文本存储为文本字节。
  • 我认为你不明白这里发生了什么。 UTF-8 有自己的方式将字符编码为字节。如果您使用 UTF8 将 ö 转换为它的 2 字节表示 (C3 B6) 并且 也使用 UTF8 将其转换回字符,则 ö 仍然是 ö。如果您将其转换为 UTF8 字节但使用 ISO-8859-1 将其转换回来,您将获得所需的 ö,这通常是您想要的。
  • 感谢@kumesana 的评论。完全有道理。我被在线转换器误导,告诉我这种编码是 UTF-8(例如link。但问题仍然存在。如何将元音变音等转换为这些神秘字符?
  • @f1sh 已经提到的是您通常不希望这种情况发生。请问你打算做什么?模拟读取错误编码的文本数据?
  • 听起来您遇到了一个配置了错误字符集的终端(很可能是在 Windows 上),并且在打印 UTF-8 时您看到了不正确的特殊字符表示。解决方法是正确配置终端。

标签: java android encoding utf-8 urlencode


【解决方案1】:

您本质上想要的是根据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");

在工作中看到它here

【讨论】:

  • 当然结果是垃圾。并依赖 ISO-8891-1 来表示特殊字符,这在 ISO-8891-13 中会有所不同。
  • @JoopEggen 从技术上讲,OP 从字面上询问如何获得垃圾。
  • @kumesana 是的,我没有批评的意思,只是再一次结果没有用,除了看看读取UTF-8的错误是否源于ISO-8859-1的读取。跨度>
  • @f1sh 非常感谢您澄清我的问题。
  • 编码字节到字符是一回事。 Base64 是一种非常常见的方法。它也很容易记录在案。不幸的是,有些人出于相同目的使用了与 ISO 8859-1 编码相反的编码。我称之为 Base256 编码。它的最大问题是它经常与纯文本混淆或被视为 mojibake,并且几乎没有记录它是什么。
猜你喜欢
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
相关资源
最近更新 更多