【问题标题】:Getting WCHAR array to std::string in unicode?在 unicode 中将 WCHAR 数组转换为 std::string?
【发布时间】:2017-04-08 06:20:17
【问题描述】:

我正在做一个 win32 应用程序,并且有一个接受 unicode 文本输入的编辑控件。我使用以下代码将文本发送到std::string:

WCHAR out[50] = {};
GetDlgItemTextW(hwnd, ID_Edit, out, 50);
wstring myWString(out);
string myString(ws.begin(), ws.end());

在 dubugger 中,我可以看到 myWString 在输入为 unicode 文本时很好,但 myString 已损坏。

如何正确转换?

编辑:

好吧,与其愚弄string,我改用wstring。 但是又出现了一个问题:

我有另一个代码使用string、cout 和cin 在控制台中获取用户输入,现在wstring、wcin 和wcout 破坏了非ASCII 文本输入和输出部分...

我的代码是:

string myString;
//...
cin >> myString;
//...
cout << myString;

改为:

wstring myString;
//...
wcin >> myString;
//...
wcout << myString;

如果用户使用非 ASCII 字符,输入和输出文本会损坏。

【问题讨论】:

  • 你为什么要首先转换?如果您需要使用国际化的非 ASCII 文本,请使用 wstring。
  • 你可以使用 WideCharToMultiByte API
  • 这个问题太宽泛了,不知道源编码和目的编码。
  • @MrEricSir:由于来自GetDlgItemTextW,源编码为UTF16。但是目标编码很重要。
  • 如果使用 Visual Studio,您需要_setmode。或查看answer 了解其他编译器。或者只是使用MessageBoxW 进行Windows 编程。您可能希望在项目中定义 UNICODE,以便 Windows API 函数默认为 UNICODE(W 版本)

标签: c++ string unicode wchar


【解决方案1】:

好的,经过谷歌搜索,我终于可以一起使用 cin 和 wstring 了,没有 unicode 问题。 我添加行:

setlocale(LC_ALL, "");
ios_base::sync_with_stdio(false);
wcin.imbue(locale(""));
wcout.imbue(locale(""));

wcin 现在很好:

wstring myString;
getline(wcin, myString);
//...
wcin >> myString;
//...
wcout << myString;

【讨论】:

    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 2011-07-21
    • 2013-10-22
    相关资源
    最近更新 更多