我正在使用Twitter API库向Twitter发布状态。 Twitter要求帖子采用UTF-8编码。该库包含一个URL编码标准字符串的函数,该函数适用于所有特殊字符,例如!@#$%^& *(),但是对重音字符(和其他UTF-8)的编码不正确。
例如,'é'转换为'%E9'而不是'%C3%A9'(它几乎只转换为十六进制值)。是否有内置函数可以输入类似'é'的内容并返回类似'%C9%A9'的内容?
编辑:我对UTF-8相当新,以防我要求的内容毫无意义。
编辑:如果我有
string foo = "bar é";
我想将其转换为
"bar %C3%A9"
由于
答案 0 :(得分:5)
如果您有宽字符串,可以使用标准wcstombs()函数在UTF8中对其进行编码。如果您使用其他编码(例如Latin-1),则必须先将其解码为宽字符串。
编辑 ...但是wcstombs()取决于您的区域设置,看起来像you can't select a UTF8 locale on Windows。 (您没有说明您正在使用的操作系统。)WideCharToMultiByte()在Windows上可能更有用,因为您可以在调用中指定编码。
答案 1 :(得分:5)
要了解需要做什么,您必须首先了解一些背景知识。不同的编码对“相同”字符使用不同的值。例如,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,但用可打印字符替换某些控制字符。