【问题标题】:Convert string to wstring [russian symbols without locale::global]将字符串转换为 wstring [没有 locale::global 的俄语符号]
【发布时间】:2015-01-08 23:47:59
【问题描述】:

是否可以在不使用 std::locale::global(std::locale("")); 的情况下将字符串转换为 wstring(假设该字符串仅包含俄语符号且系统编码为 utf-8)? 我需要 C++98 的解决方案。

一些代码:

string s = "Николай";
wstring ws;
StrToWstr(ws, s);
printf("str: %ls\n", ws.c_str());

输出为空。 但是,当我添加

std::locale::global(std::locale(""))

它会打印我

 "Николай" (correct output).

StrToWstr 方法:

size_t StrToWstr(wstring& aDst, const string& aSrc)
{
    size_t length;
    length = mbstowcs(NULL, aSrc.c_str(), 0);
    if (length != static_cast<size_t>(-1)) {
        wchar_t *buffer = new wchar_t[length + 1];
        length = mbstowcs(buffer, aSrc.c_str(), length);
        buffer[length] = L'\0';
        aDst.assign(buffer);
        delete[] buffer;
    }
    return length;
}

调试显示,ws包含以下内容:

    Name : ws
        Details:{static npos = <optimized out>,
 _M_dataplus = {<std::allocator<wchar_t>> =
 {<__gnu_cxx::new_allocator<wchar_t>> = {<No data fields>},
<No data fields>}, _M_p = 0xb7fbda7c L""}}

【问题讨论】:

  • 输出为空,但ws 是否包含某些内容?

标签: c++ string unicode utf-8 wstring


【解决方案1】:

您希望如何对输出字符串进行编码? UTF16、UTF2 还是其他? 如果任一转换都很好,您可以尝试

// UTF16 conversion
std::wstring_convert<codecvt_utf8_utf16<wchar_t>> converter;
aDst = converter.from_bytes(aSrc);

// UTF2 conversion
std::wstring_convert<codecvt_utf8<wchar_t>> converter;
aDst = converter.from_bytes(aSrc);

我不确定UTF8->多字节转换是否可行,但你可以试试

std::wstring_convert<std::codecvt<wchar_t, char, std::mbstate_t>> converter;
aDst = converter.from_bytes(aSrc);

您可能想查看http://en.cppreference.com/w/cpp/locale/codecvt 了解更多信息。

【讨论】:

  • 谢谢,但此解决方案适用于 C++11,而我使用的是 C++98。 (已编辑问题)
猜你喜欢
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 2021-07-27
相关资源
最近更新 更多