首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >clang:将常量char16_t* (UTF-16)转换为wstring (UCS-4)

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

Stack Overflow用户
提问于 2011-12-17 05:01:27
回答 1查看 6.8K关注 0票数 4

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

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

我的代码类似于:

代码语言:javascript
复制
#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版本(Xcode4.2)没有unicode字符串文字的问题。

当代码运行时,我得到了终止异常。我在这里做了什么违法的事吗?我认为它应该可以工作,因为我传递给wstring_convert的const char*是UTF-16编码的,对吧?我也考虑过字节序的问题,但我检查过它不是这样的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-17 06:05:50

两个错误:

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

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

代码语言:javascript
复制
#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 Studio2010 SP1和Linux上的CLang++/libc++-svn。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8540090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档