在string,u16string&之间转换u32string

时间:2011-08-29 16:09:17

标签: c++ string unicode c++11 unicode-string

我一直在寻找一种在Unicode字符串类型之间进行转换的方法,并遇到this method。我不仅没有完全理解方法(没有评论),而且文章暗示将来会有更好的方法。

如果这是最好的方法,请指出是什么让它起作用,如果不是,我想听听有关更好方法的建议。

3 个答案:

答案 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)。但是,我不知道编译器会这样做。