【问题标题】:How can I pass unicode strings in variables with L (or without)如何在带有 L (或不带)的变量中传递 unicode 字符串
【发布时间】:2012-08-27 02:20:06
【问题描述】:

我有

MessageBoxW(hwnd, L"Καλημέρα", L"Τέστ", MB_OK|MB_APPLMODAL);

这可行,但现在我如何传递变量“消息”和“标题”中的值?我不能再使用 L 因为它是一个变量,

MessageBoxW(hwnd, Lmessage, Lcaption, MB_OK|MB_APPLMODAL); //doesn't work

是否有 L(message) 或什么?消息和标题是 WCHAR。

【问题讨论】:

  • 您确定messagecaptionWCHAR 类型吗?这意味着他们每个人都有一个字符。他们可能是WCHAR*吗?

标签: c++ c string unicode


【解决方案1】:
std::wstring s1 = L"Καλημέρα";
std::wstring s2 = L"Τέστ";
MessageBoxW(hwnd, s1, s2, MB_OK|MB_APPLMODAL);

要获得等效的 C 字符串:

usual_c_string=s1.c_str();

There are various conversions between string types.

【讨论】:

  • 我不认为有一个 MessageBoxW 版本需要std::wstring。您需要使用.c_str()
【解决方案2】:

如果您的变量是WCHAR* 类型,它们自然是长字符串格式。

您可以按原样将它们传递给MessageBoxW

MessageBoxW(hwnd, message, caption, MB_OK|MB_APPLMODAL);

【讨论】:

    【解决方案3】:

    工作示例:

    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    #include <string>
    
    int main()
    {
        std::wstring message = L"Καλημέρα";
        std::wstring header = L"Τέστ";
        MessageBoxW(NULL, message.c_str(), header.c_str(), MB_OK);
        return 0;
    }
    

    【讨论】:

      【解决方案4】:

      更好:

      MessageBoxW(hwnd, boost::widen(message).c_str(), boost::widen(caption).c_str(), MB_OK|MB_APPLMODAL);
      

      请参阅 utf8everywhere.org 了解这背后的解释。 另外:我会避免在 MSVC 上使用非 ascii 字符串文字。如果源文件以不同的编码保存,此代码的结果可能会发生变化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-12
        • 1970-01-01
        • 2019-12-02
        相关资源
        最近更新 更多