clang:将const char16_t* (UTF-16)转换为wstring (UCS-4)
clang: converting const char16_t* (UTF-16) to wstring (UCS-4)
我正在尝试将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测试。
相关文章:
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 从/到 UTF-8/UTF-16 的转换需要(例如:utf8 -> 代码点,然后代码点到 utf16)或(例如:utf8 -> utf16)?
- 在 Linux 中将 UTF-32 宽字符转换为 UTF-16 宽字符以获取补充平面字符
- C 14:UTF-8/UTF-16与本机字符编码之间的转换
- 使用标准C++无线流读取UTF-8文本并转换为UTF-16
- 将字节数组从UTF-16转换为UTF-8
- 如何将UTF-16中的字符串转换为C 中的UTF-8
- 为什么我不能在窗口上使用 boost::locale::conv::between 将 UTF-16 文本转换为其他编码
- 将 UTF-8 文件转换为 UTF-16
- 如何将 UTF-8 编码的 std::string 转换为 UTF-16 std::string
- 将 ASCII 字符串转换为 UTF-16,然后再将它们传递给 Windows API 函数
- C++ UTF-16 到 char 的转换(Linux/Ubuntu)
- C++ 读取 UTF-8 文件正常,转换为 UTF-16 正常,写回文件不正常
- 将wchar_t*转换为UTF-16字符串
- 在UTF-8内部工作,然后仅在Windows中需要时转换为UTF-16,是否存在任何危险
- clang:将const char16_t* (UTF-16)转换为wstring (UCS-4)
- c++是否支持除UTF-8、UTF-16和UTF-32以外的字符编码之间的转换?
- 如何将std::string中包含utf-16编码的文本转换为utf-16 wstring
- 如何将UTF-8的std::string转换为UTF-16的std::wstring
- 如何在Linux上使用std库从utf-16转换为utf-32