【问题标题】:Character encoding not consistent (Win32 API)字符编码不一致(Win32 API)
【发布时间】:2021-07-01 20:39:36
【问题描述】:

我正在使用 C++ 开发一个 Win32 桌面应用程序,目标语言是瑞典语。因此,我依靠 Unicode 来正确格式化和显示任何给定的字符串。但是,我遇到了一个非常特殊的问题,即由非英语字符(例如å、ä、ö)组成的字符串在代码的一部分中工作,但在代码的另一部分中中断。

更具体地说,代码在一个文件中有效,但在另一个文件中无效。如果我将代码块移动到另一个文件,则文本会再次正确显示。请参阅以下示例:

CreateWindowW(L"Button", L"Lägg till kund", WS_TABSTOP | WS_VISIBLE | WS_CHILD, 
              0, 0, 80, 25, windowHandle, (HMENU)0, NULL, NULL);

-从 Application.cpp 文件中调用。

AppendMenu(m_MainMenuBar, MF_POPUP, (UINT_PTR)m_ArkivMenu, L"&Arkiv");
AppendMenu(m_MainMenuBar, MF_POPUP, (UINT_PTR)m_VisaMenu, L"&Visa");
AppendMenu(m_MainMenuBar, MF_POPUP, (UINT_PTR)m_ArkivMenu, L"&Hjälp");
AppendMenu(m_MainMenuBar, MF_POPUP, (UINT_PTR)m_ArkivMenu, L"&Sök");

-从 Window.cpp 文件中调用。

所有这些都会导致以下结果:

请注意,从 Window.cpp 调用的代码会生成包含无效字符的文本,这表明无法找到符号。这很奇怪,因为如果我将代码从 Window.cpp 移动到 Application.cpp,问题就不复存在了。

因此,唯一合乎逻辑的结论是这两个文件之间的字符编码必须不同,但为什么呢?

【问题讨论】:

标签: c++ winapi


【解决方案1】:

问题确实如标题所述,“字符编码不一致”。

准确地说,这是Window.cpp 的字符编码与Application.cpp 的字符编码相比。我怀疑环境是 Visual Studio,它可以处理多种编码的文件。但是对于包含 Unicode 的源代码,您可能希望使用带有“签名”(BOM) 的 UTF-8。

这可通过“另存为”在 Visual Studio 2017+ 中使用,并在该保存对话框中选择 "Save With Encoding" 而不是普通的“保存”。

【讨论】:

  • 谢谢!事实证明,其中一个文件,更具体地说是 Application.h 使用了西欧 DOS 签名。我不知道为什么会发生这种情况,但问题现在已经解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 2011-09-10
  • 1970-01-01
相关资源
最近更新 更多