如何UTF-8编码字符/字符串

tom*_*tom 6 c++ string twitter utf-8 character-encoding

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

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

编辑:我是UTF-8的新手,以防我要求的内容毫无意义.

编辑:如果我有

string foo = "bar é";
Run Code Online (Sandbox Code Playgroud)

我想把它转换成

"bar %C3%A9"
Run Code Online (Sandbox Code Playgroud)

谢谢

Mar*_*one 7

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

编辑: ...但是wcstombs()取决于您的区域设置,看起来您无法在Windows上选择UTF8区域设置.(您没有说明您正在使用的操作系统.) WideCharToMultiByte()在Windows上可能更有用,因为您可以在调用中指定编码.


Fre*_*urk 6

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

要从一种编码转换为另一种编码,必须首先获取编码值,将其解码为独立于源编码的值(即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,但用可打印字符替换某些控制字符.