我从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?
答案 0 :(得分:5)
要翻译与用户配置的区域设置无关的数据,而是明确指定的编码,您应该使用iconv
,而不是mbsrtowcs
。您根本不需要setlocale
。
答案 1 :(得分:4)
正如@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中通常称为“宽字符”),您可以使用MultiByteToWideChar之类的函数参数CP_UTF8
答案 2 :(得分:0)
这是a little discussion我刚开始谈论这个问题。
基本上,我个人会在编码处理方面区分两条不同的路径:
一个是与编码无关的“内部可移植”路径,它使用mbstowcs
转换来自char * argv[]
的外部多字节数据并将其转换为内部固定宽度宽字符串,所有这些都没有谈论编码。
另一种是固定编码,可序列化的路径,用于处理以确定性编码方式发布的数据。为了在这些中进行翻译,Posix iconv
库可以解决问题。
您可以使用iconv
特殊的WCHAR_T编码在两条路径之间架起桥梁。
由于您描述的情况需要您阅读序列化的确定性数据,我建议使用iconv转换FROM UTF8(您知道的)并转换为WCHAR_T,然后您可以使用标准C宽字符串处理函数(但不要对实际编码做出假设)。如果您需要将数据打印到控制台,您可以始终从内部宽字符串wcstombs
到控制台告诉您需要的多字节表示(其详细信息不再是您关心的问题)。