【问题标题】:How to UTF-8 encode a character/string如何对字符/字符串进行 UTF-8 编码
【发布时间】:2011-07-02 06:24:31
【问题描述】:

我正在使用 Twitter API 库将状态发布到 Twitter。 Twitter 要求帖子采用 UTF-8 编码。该库包含一个对标准字符串进行 URL 编码的函数,该函数非常适用于所有特殊字符,例如 !@#$%^&*(),但对于重音字符(和其他 UTF-8)编码不正确。

例如,'é' 被转换为 '%E9' 而不是 '%C3%A9'(它几乎只转换为十六进制值)。是否有内置函数可以输入“é”之类的内容并返回“%C9%A9”之类的内容?

编辑:我对 UTF-8 相当陌生,以防我的请求没有意义。

编辑:如果我有一个

string foo = "bar é";

我想把它转换成

"bar %C3%A9"

谢谢

【问题讨论】:

  • 我想你想对字符串进行 URL 编码,而不是 UTF-8 编码。
  • @NemanjaTrifunovic:他需要两者:“Twitter 需要…UTF-8”,并且他正在通过 URL 传递值。

标签: c++ string twitter utf-8 character-encoding


【解决方案1】:

如果您有一个宽字符串,您可以使用标准wcstombs() 函数将其编码为UTF8。如果您有其他编码(例如 Latin-1),则必须先将其解码为宽字符串。

编辑: ...但 wcstombs() 取决于您的语言环境设置,它看起来像 you can't select a UTF8 locale on Windows。 (你没有说你正在使用什么操作系统。)WideCharToMultiByte() 在 Windows 上可能更有用,因为你可以在调用中指定编码。

【讨论】:

  • 这个函数似乎只是返回与 c 风格字符串相同的字符串,“é”保持不变,而不是被转换为“%C3%A9”。
  • 不,我是 :S -- wcstombs 转换为您配置的语言环境的编码,这对我来说看起来像是 Latin-1,所以这不好。如果您在 Windows 上,您可能想尝试 WideCharToMultiByte() 代替。 (答案已更新。)
【解决方案2】:

要了解需要做什么,您必须先了解一些背景知识。不同的编码对“相同”字符使用不同的值。例如,Latin-1 表示“é”是值为 E9(十六进制)的单字节,而 UTF-8 表示“é”是 C3 A9 的两个字节序列,而 UTF-16 表示相同的字符是单字节双字节值 00E9 – 一个 16 位值,而不是 UTF-8 中的两个 8 位值。 (Unicode,它不是一种编码,实际上使用与 Latin-1 相同的代码点值 U+E9。)

要从一种编码转换为另一种编码,您必须首先获取编码值,将其解码为独立于源编码(即 Unicode 代码点)的值,然后在目标编码中重新编码。如果目标编码不支持所有源编码的代码点,那么您需要翻译或以其他方式处理这种情况。

这个重新编码步骤需要知道源编码和目标编码。

您的 API 函数没有转换编码;它似乎是对任意字节字符串进行 URL 转义。该函数的作者显然假设您将已经转换为 UTF-8。

为了转换为 UTF-8,您必须知道您的系统正在使用什么编码并且能够映射到 Unicode 代码点。从那里开始,UTF-8 编码就变得微不足道了。

根据您的系统,这可能就像将“本机”字符集(“é”为您的 E9,因此可能是 Windows-1252、Latin-1 或非常相似的东西)转换为宽字符一样简单(如果 sizeof(wchar_t) 为 2,则可能是 UTF-16 或 UCS-2,如果 sizeof(wchar_t) 为 4,则可能是 UTF-32),然后是 UTF-8。正如 Martin 所回答的,Wcstombs 可能能够处理此转换的第二部分,但这取决于系统。但是,我相信 Latin-1 是 Unicode 的一个子集,因此从这种源编码转换可以跳过宽字符步骤。 Windows-1252 接近 Latin-1,但用可打印字符替换了一些控制字符。

【讨论】:

  • 我在上面省略了它,但是一旦你转换为 UTF-8,你仍然会调用这个 API 函数来对值进行 URL 转义。
  • 很好的解释。我觉得我对编码的理解由此得到了丰富(从来都不是编码的粉丝)。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-03-28
  • 2014-06-09
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多