我一直在寻找一种在Unicode字符串类型之间进行转换的方法,并遇到this method。我不仅没有完全理解方法(没有评论),而且文章暗示将来会有更好的方法。
如果这是最好的方法,请指出是什么让它起作用,如果不是,我想听听有关更好方法的建议。
答案 0 :(得分:87)
答案 1 :(得分:12)
我编写了辅助函数来转换为UTF8字符串(C ++ 11):
#include <string>
#include <locale>
#include <codecvt>
using namespace std;
template <typename T>
string toUTF8(const basic_string<T, char_traits<T>, allocator<T>>& source)
{
string result;
wstring_convert<codecvt_utf8_utf16<T>, T> convertor;
result = convertor.to_bytes(source);
return result;
}
template <typename T>
void fromUTF8(const string& source, basic_string<T, char_traits<T>, allocator<T>>& result)
{
wstring_convert<codecvt_utf8_utf16<T>, T> convertor;
result = convertor.from_bytes(source);
}
用法示例:
// Unicode <-> UTF8
{
wstring uStr = L"Unicode string";
string str = toUTF8(uStr);
wstring after;
fromUTF8(str, after);
assert(uStr == after);
}
// UTF16 <-> UTF8
{
u16string uStr;
uStr.push_back('A');
string str = toUTF8(uStr);
u16string after;
fromUTF8(str, after);
assert(uStr == after);
}
答案 2 :(得分:-2)
据我所知,C ++没有提供从UTF-32转换或转换为UTF-32的标准方法。但是,对于UTF-16,有方法 mbstowcs (多字节到宽字符串),反之, wcstombs 。
如果你也需要UTF-32,你需要 iconv ,这是在POSIX 2001中而不是在标准C中,所以在Windows上你需要像 libiconv
以下是如何使用 mbstowcs :
的示例#include <string>
#include <iostream>
#include <stdlib.h>
using namespace std;
wstring widestring(const string &text);
int main()
{
string text;
cout << "Enter something: ";
cin >> text;
wcout << L"You entered " << widestring(text) << ".\n";
return 0;
}
wstring widestring(const string &text)
{
wstring result;
result.resize(text.length());
mbstowcs(&result[0], &text[0], text.length());
return result;
}
反之亦然:
string mbstring(const wstring &text)
{
string result;
result.resize(text.length());
wcstombs(&result[0], &text[0], text.length());
return result;
}
Nitpick:是的,我知道,wchar_t的大小是实现定义的,因此 可以是4字节(UTF-32)。但是,我不知道编译器会这样做。