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)
谢谢
如果您有一个宽字符串,您可以使用标准的wcstombs()函数将其编码为UTF8 .如果您使用其他编码(例如Latin-1),则必须先将其解码为宽字符串.
编辑: ...但是wcstombs()取决于您的区域设置,看起来您无法在Windows上选择UTF8区域设置.(您没有说明您正在使用的操作系统.) WideCharToMultiByte()在Windows上可能更有用,因为您可以在调用中指定编码.
要了解需要做什么,您必须首先了解一些背景知识.不同的编码对"相同"字符使用不同的值.例如,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,但用可打印字符替换某些控制字符.
归档时间: |
|
查看次数: |
15258 次 |
最近记录: |