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

clang: converting const char16_t* (UTF-16) to wstring (UCS-4)

本文关键字:UTF-16 转换 UCS-4 wstring const char16 clang      更新时间:2023-10-16

我正在尝试将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字符串字面量的事实。

当代码运行时,我得到terminate异常。我做了什么违法的事吗?我认为它应该工作,因为我传递给wstring_convert的const char*是UTF-16编码的,对吧?

我也考虑过顺序问题,但我检查过情况并非如此。

两个错误:

1) from_bytes()过载,接受单个const char*期望一个以空结束的字节字符串,但您的第二个字节是''。

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测试。