我从facebook api获取了一个带有数据的XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<fql_query_response xmlns="api.facebook.com/1.0/"; xmlns:xsi="w3.org/2001/XMLSchema-instance"; list="true">
<user>
<uid>100000022063315</uid>
<name>0xD7 0x99 0xD7 0x95 0xD7 0x97 0xD7 0x90 0xD7 0x99 0x20 0xD7 0x95 0xD7 0x9B 0xD7 0x98 0xD7 0xA8</name>
</user>
</fql_query_response>
我想将UTF-8翻译成wchar_t . 我试图用mbstowcs这样做,但显然我需要知道要设置的语言环境 . Facebook有标准的区域设置吗?还是对于utf8?
3 回答
要转换's not associated with the user'配置的语言环境,而不是显式指定的编码,您应该使用
iconv
,而不是mbsrtowcs
. 你根本不需要setlocale
.正如@pst所说,这里的术语有点不对劲 . “区域设置”有时用于指代在unicode不可用时使用哪个ANSI代码页来表示国际文本 .
阅读Joel Spolsky的精彩内容"The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)"
现在,要回答您的问题,如果您需要将UTF-8编码的文本转换为UTF-16(或Windows中的通常称为"wide char"),您可以使用MultiByteToWideChar等函数和参数
CP_UTF8
这是a little discussion我刚开始就这个问题开始了 .
基本上,我个人会在编码处理上区分两个不同的路径:
一个是与编码无关的"internally portable"路径,它使用
mbstowcs
转换来自char * argv[]
的外部多字节数据并将其转换为内部的固定宽度宽字符串,所有这些都没有谈论编码 .另一个是固定编码,可序列化的路径,用于处理以确定性编码方式发布的数据 . 为了在这些中进行翻译,Posix
iconv
库可以解决问题 .您可以使用
iconv
的特殊WCHAR_T编码在两条路径之间架起桥梁 .由于您描述的情况需要您阅读序列化的确定性数据,我建议使用iconv转换FROM UTF8(您知道的)并转换为WCHAR_T,然后您可以使用标准C宽字符串函数处理(但是不要对实际编码做出假设) . 如果您需要将数据打印到控制台,您可以始终从内部宽字符串
wcstombs
到控制台告诉您需要的多字节表示(其详细信息不再是您关心的) .