wstring字符是Unicode吗?转换期间会发生什么?

时间:2014-12-01 09:23:36

标签: c++ string unicode encoding utf-8

最近,我遇到了将UTF-8编码转换为字符串和副版本的问题。我知道UTF-8编码用于保存世界上几乎所有的字符,同时使用以字符串数据类型构建的char,只能存储ASCII值。对于UTF-8编码的字符,需要的字节数在内存中,从一个字节到4个字节不等,但对于“内存”来说。输入通常是1个字节。

我的问题是从wstring转换为string或wchar转换为char会发生什么? 是否会跳过需要多个字节的字符?它似乎取决于实现,但我想知道这样做的正确方法。

还需要wchar来存储unicode字符吗?据我所知,UNICODE字符也可以存储在普通字符串中。我们为什么要使用wstring或wchar?

2 个答案:

答案 0 :(得分:1)

取决于你如何转换它们 您需要指定源编码类型和目标编码类型 wstring不是格式,只是定义数据类型。

现在通常当一个人说" Unicode"时,一个意味着UTF16这是 Microsoft Windows 使用的,这通常是wstring包含的内容。

因此,从UTF8转换为UTF16的正确方法是:

     std::string utf8String = "blah blah";

     std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
     std::wstring utf16String = convert.from_bytes( utf8String );

反过来说:

     std::wstring utf16String = "blah blah";

     std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
     std::string utf16String = convert.to_bytes( utf16String );

增加了混乱:
当您在 Windows 平台上使用std::string时(例如,当您使用多字节编译时),它不是 UTF8 。他们使用 ANSI 更具体地说,是Windows正在使用的默认编码语言。

在Unicode中编译时,windows API命令需要以下格式:

命令 A - 多字节 - ANSI
命令 W - Unicode - UTF16

答案 1 :(得分:1)

使您的源文件采用UTF-8编码,在IDE中将字符编码设置为UNICODE 使用std :: string并为WindowsAPI调用加宽它们。
std::string somestring = "こんにちは"; WindowsApiW(widen(somestring).c_str());
我知道这听起来有点讨厌,但可以在utf8everywhere.org找到对这个问题更深刻的解释。

相关问题