【问题标题】:cp1251: encoding distortion when converting from char* to wchar_t*cp1251:从 char* 转换为 wchar_t* 时编码失真
【发布时间】:2019-01-31 17:12:39
【问题描述】:

我有一个俄语字符串,以 cp1251 编码存储在 cpp 源文件中。

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    const char *src = "Мой текст";
    wchar_t dst[30];

    switch (message)
    {
    case WM_CREATE:
        mbstowcs(dst, src, 29);
        //outputs "Ìîé òåêñò" instead of "Мой текст"
        MessageBox(hWnd, dst, L"Header", MB_OK);    
    ...

很遗憾,“Мой текст”被扭曲了。在这种情况下似乎不应该使用mbstowcs,但是我应该使用什么?

在 WinMain 尝试过 std::setlocale(LC_ALL, "ru_RU.cp1251");,但没有帮助。

【问题讨论】:

  • 试试MultiByteToWideChar,它可以让你明确指定代码页。
  • 另外,尝试使用"ru-RU.cp1251" 作为语言环境字符串(破折号,而不是下划线)。我怀疑您的setlocale 呼叫失败;检查一下。
  • 或者试试setlocale(LC_ALL, "Russian_Russia.1251")
  • 为什么不将所有文本最初都设为 unicode 格式的 L"Мой текст"?在这种情况下不需要转换
  • "Мой текст" 这样的narrow 字符串文字的编码取决于用于保存源文件的字符集(除非您使用u8 前缀来强制使用UTF- 8)。这可能与mbstowcs() 在运行时使用的字符集不同。就像 RbMm 所说,您应该使用 wide 字符串文字:const wchar_t *src = L"Мой текст"; ... MessageBoxW(hWnd, src, L"Header", MB_OK);

标签: c++ winapi character-encoding char wchar-t


【解决方案1】:

根据Microsoft's documentation,语言环境字符串的格式为language[_country_region[.code_page]],其中code_page 是不带“cp”的代码页编号。 table of supported languages and countries 列出了“Russian”和“Russia”,所以setlocale 的正确字符串是"Russian_Russia.1251"

【讨论】:

    猜你喜欢
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    相关资源
    最近更新 更多