【问题标题】:What is the locale of UTF8?UTF8 的语言环境是什么?
【发布时间】:2011-09-22 03:25:33
【问题描述】:

我正在从 facebook api 获取包含数据的 XML 文件:

&lt?xml 版本="1.0" 编码="UTF-8"?&gt
&ltfql_query_response xmlns="api.facebook.com/1.0/"; xmlns:xsi="w3.org/2001/XMLSchema-instance";列表=“真”&gt
    &lt用户&gt
        &ltuid&gt100000022063315&lt/uid&gt
        &lt名称&gt0xD7 0x99 0xD7 0x95 0xD7 0x97 0xD7 0x90 0xD7 0x99 0x20 0xD7 0x95 0xD7 0x9B 0xD7 0x98 0xD7 0xA8&lt/名称&gt
    &lt/用户&gt
&lt/fql_query_response&gt

我想将 UTF-8 翻译成 wchar_t。我正在尝试使用 mbstowcs 这样做,但显然我需要知道要设置的语言环境。 facebook 有标准的语言环境吗?还是 utf8?

【问题讨论】:

  • UTF-8 没有“语言环境”。它只是Unicodeencoding(将Unicode 代码点映射到一个或多个字节,通常用于传输)——Unicode 是什么“语言环境”?
  • 任何以“.utf8”结尾的语言环境都可以,例如“en_US.utf8”。在你做mbsrtowcs之前说setlocale(LC_CTYPE, "en_US.utf8");,它应该可以工作。或者使用从 UTF8 到 WCHAR_T 的 iconv。
  • 我会将其设置为 wchar_t 字符串为 UTF-16(或取决于 UTF-32)
  • @Kerrek SB:这是 Linux 语言环境。在 Windows 上,If you provide a code page like UTF-7 or UTF-8, setlocale will fail, returning NULL
  • @Martin:你无法控制mbstowcs结果。它只是一些实现定义的固定宽度字符串。 @MSalters。好点子。使用 iconv(从 UTF8 到 WCHAR_T),如下所示。

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


【解决方案1】:

要翻译与用户配置的区域设置无关的数据,而是明确指定的编码,您应该使用iconv,而不是mbsrtowcs。你根本不需要setlocale

【讨论】:

    【解决方案2】:

    正如@pst 所说,这里的术语有点错误。 “Locale”有时用于指代在 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

    【讨论】:

    • 是的,我在 Ubuntu 上运行,因此需要 mbstowcs
    • 还应注意this article,这是对乔尔上述文章的一种回答。
    【解决方案3】:

    这里是a little discussion 我刚刚开始讨论这个主题。

    基本上,我个人会在编码处理上区分两条不同的路径:

    • 一个是与编码无关的“内部可移植”路径,它使用mbstowcs 将外部多字节数据从char * argv[] 转换为内部、固定宽度的宽字符串,所有这些都无需交谈关于编码。

    • 另一个是固定编码、可序列化的路径,用于处理以确定性编码传送的数据。为了在这些之间进行翻译,Posix iconv 库可以做到这一点。

    • 您可以使用iconv 的特殊WCHAR_T 编码在两条路径之间架起桥梁。

    由于您描述的情况需要您读取序列化的确定性数据,我建议使用 iconv 转换 FROM UTF8(您知道您有)并转换为 WCHAR_T,然后您可以使用标准 C 宽字符串处理功能(但不要对实际编码做出假设)。如果您需要将数据打印到控制台,您始终可以将内部宽字符串 wcstombs 转换为控制台告诉您它想要的多字节表示(其细节再次与您无关)。

    【讨论】:

    • @R.:是的; printf("%ls") 将为您处理转换。好点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2011-05-18
    相关资源
    最近更新 更多