C ++ 11和Win32 wchar_t

时间:2013-09-25 14:49:20

标签: c++ winapi c++11 utf-8

我正在编写一个c++11库,它提供了一个用于设置环境变量的跨平台API。 c++11的好处是所有char字符串都是UTF-8

environment::Set(const std::string& name, const std::string& value)

在Windows上,SetEnvironmentVariable函数有两个别名SetEnvironmentVariableASetEnvironmentVariableW

我的理解是,宽版本需要16位wchar_t,在Windows中为UTF-16,ANSI版本为ASCII。

使用此函数将std::string转换为UTF-16(使用std::codecvt_utf8_utf16或其他内容)然后输入广泛版本的函数的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

是的,Windows仅通过其“广泛”版本的API(使用UTF-16)支持Unicode; “ANSI”(基于char)函数仅支持“本地”代码页,而不支持UTF-8。

答案 1 :(得分:4)

  

c ++ 11的好处是所有char字符串都是UTF-8:

C ++ 11没有为普通字符串文字指定这一点,你会发现VC ++没有这样做。如果你想要UTF-8字符串,那么你必须确保自己。

  

我的理解是宽版本需要一个16位的wchar_t,在Windows中是UTF-16,ANSI版本是ASCII。

*A函数始终使用系统代码页,这是ASCII的扩展版本(绝不是UTF-8)。

  

使用此函数将std :: string转换为UTF-16(使用std :: codecvt_utf8_utf16或其他东西)然后将其放入函数的宽版本中是否正确?

如果您确保您的字符串是UTF-8(这是一个好主意,IMO),那么转换为UTF-16并使用wchar_t版本是正确的做法。

#include <Windows.h>
#include <codecvt>

int main() {
  std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>,wchar_t> convert;

  std::string var = "\xD0\xBA\xD0\xBE\xD1\x88\xD0\xBA\xD0\xB0"; // кошка
  std::string val = "\xE6\x97\xA5\xE6\x9C\xAC\xE5\x9B\xBD";     // 日本国

  SetEnvironmentVariableW(convert.from_bytes(var).c_str(),
                          convert.from_bytes(val).c_str());
}

通过完整的C ++ 11一致性,我们可以编写std::string var = u8"кошка";,但是VC ++没有实现这一点,它似乎是一个非常低优先级的项目,因为它没有明确地出现在roadmap to C++14上一致性。

或者,如果将源代码保存为“无BOM的UTF-8”,则可以编写std::string var = "кошка";。请注意,该方法有一些警告,例如您不能使用wchar_t文字。