【问题标题】:Why does message box in C++ show chinese message [duplicate]为什么C ++中的消息框显示中文消息[重复]
【发布时间】:2012-05-27 03:12:07
【问题描述】:

可能重复:
Why does my simple C++ GUI application show a message box in Chinese?

我已经在 Visual C++ 中实现了如下代码块:

int nResult=MessageBox(NULL,
                       (LPCWSTR)"An example of Cancel,Retry,Continue",
                       (LPCWSTR)"Message Box!",
                        MB_ICONWARNING|MB_ABORTRETRYIGNORE);

但是,无论我尝试什么,它总是显示一个中文消息框!因此,我只想为我的问题寻求任何解决方案以及为什么这里有中文信息。谢谢你!

【问题讨论】:

  • 天哪,又是这个微不足道的问题。 :-)
  • 我也有中文!为什么我们都学中文?是不是有这么多的中文字符,以至于任何时候一个字符串指向内存中的某个随机位置,很有可能是中文?

标签: c++ visual-studio-2010 winapi


【解决方案1】:

您忘记在字符串文字前放置“L”。修改如下:

int nResult=MessageBox(NULL,
                   L"An example of Cancel,Retry,Continue",
                   L"Message Box!",
                   MB_ICONWARNING|MB_ABORTRETRYIGNORE);

在 C++ 中,unicode 字符串文字以 L 为前缀。如果您不添加前缀,则强制转换为“unicode string constant”将无济于事,并导致对内存位置的错误解释。

【讨论】:

  • 你能告诉我在哪里可以了解有关这种特定类型的铸造的更多信息吗?据我所知,通常选角由(Type) thingToBeCasted 组成。我不明白我们如何转换为 L 以及它的含义。
  • 这不是演员表。如果将 (LPCWSTR) 放在字符串文字之前,它 is 是一个强制转换,但将 L 字符放在字符串文字之前,会告诉编译器将字符串解释 Unicode 字符串。请参阅here 了解更多信息。
  • 把它变成宽字符串,你是对的。
【解决方案2】:

您期望将指针从一种类型转换为另一种类型以更改指向的值。这不是 C++ 强制转换所做的。他们只是告诉编译器假设指针指向新类型。要指定wide literal,请在引号前使用L(或new string literals,如果您的编译器支持它们)。并且摆脱演员表,它只是掩盖了错误。

【讨论】:

    【解决方案3】:

    正如大卫所说,您已将 ASCII 字符串转换为 UNICODE 字符串。请改用 _TEXT("Your string") 宏。

    您不能只将 ASCII 字节解释为 UNICODE 字符串,否则会发生不好的事情。

    编辑:此外,如果您想要 ASCII 字符串,您可以显式调用 MessageBoxA() 或在项目设置中更改为多字节字符设置。

    【讨论】:

    • 这是正确的做法。在您的字符串文字周围使用 _T() 或 _TEXT() ,或者使用 MessageBoxA() 或 MessageBoxW() ,无论是否在编译时定义了 UNICODE 宏,它们都不会改变。微软不应该引入那个愚蠢的宏!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多