UTF8的语言环境是什么?

时间:2011-06-24 15:30:18

标签: c++ c facebook utf-8 facebook-graph-api

我从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 个答案:

答案 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到控制台告诉您需要的多字节表示(其详细信息不再是您关心的问题)。