我正在编写一个c++11
库,它提供了一个用于设置环境变量的跨平台API。 c++11
的好处是所有char
字符串都是UTF-8
:
environment::Set(const std::string& name, const std::string& value)
在Windows上,SetEnvironmentVariable
函数有两个别名SetEnvironmentVariableA
和SetEnvironmentVariableW
。
我的理解是,宽版本需要16位wchar_t
,在Windows中为UTF-16
,ANSI版本为ASCII。
使用此函数将std::string
转换为UTF-16
(使用std::codecvt_utf8_utf16
或其他内容)然后输入广泛版本的函数的正确方法是什么?
答案 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文字。