gpt4 book ai didi

c++ - clang:将 const char16_t* (UTF-16) 转换为 wstring (UCS-4)

转载 作者:太空狗 更新时间:2023-10-29 20:00:09 27 4
gpt4 key购买 nike

我正在尝试将 UTF-16 编码的字符串转换为 UCS-4

如果我没理解错的话,C++11是通过codecvt_utf16提供这种转换的。

我的代码是这样的:

#include <iostream>
#include <locale>
#include <memory>
#include <codecvt>
#include <string>

using namespace std;

int main()
{
u16string s;

s.push_back('h');
s.push_back('e');
s.push_back('l');
s.push_back('l');
s.push_back('o');

wstring_convert<codecvt_utf16<wchar_t>, wchar_t> conv;
wstring ws = conv.from_bytes(reinterpret_cast<const char*> (s.c_str()));

wcout << ws << endl;

return 0;
}

注意:明确的 push_backs 可以解决我的 clang 版本 (Xcode 4.2) 没有 unicode 字符串文字的事实。

运行代码时,出现终止异常。我在这里做违法的事吗?我认为它应该可以工作,因为我传递给 wstring_convert 的 const char* 是 UTF-16 编码的,对吧?我也认为字节序是问题所在,但我已经检查过情况并非如此。

最佳答案

两个错误:

1) 采用单个 const char*from_bytes() 重载需要一个以 null 结尾的字节字符串,但您的第二个字节是“\0”。

2) 您的系统可能是小端,因此您需要从 UTF-16LE 转换为 UCS-4:

#include <iostream>
#include <locale>
#include <memory>
#include <codecvt>
#include <string>

using namespace std;

int main()
{
u16string s;

s.push_back('h');
s.push_back('e');
s.push_back('l');
s.push_back('l');
s.push_back('o');

wstring_convert<codecvt_utf16<wchar_t, 0x10ffff, little_endian>,
wchar_t> conv;
wstring ws = conv.from_bytes(
reinterpret_cast<const char*> (&s[0]),
reinterpret_cast<const char*> (&s[0] + s.size()));

wcout << ws << endl;

return 0;
}

在 Windows 上使用 Visual Studio 2010 SP1 和在 Linux 上使用 CLang++/libc++-svn 进行测试。

关于c++ - clang:将 const char16_t* (UTF-16) 转换为 wstring (UCS-4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8540090/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com