visual studio c++ UNICODE 相关故障排除循环
Posted
技术标签:
【中文标题】visual studio c++ UNICODE 相关故障排除循环【英文标题】:visual studio c++ UNICODE related troubleshooting loop 【发布时间】:2017-07-19 19:47:11 【问题描述】:我继承了一个我无法构建的 c++ Visual Studio 项目。问题是很多像“CreateEvent”这样的api调用都有char*输入,但是错误代码需要“LPCWSTR”。它实际上是数百行代码,或多或少有类似的抱怨。
寻求帮助,常见的解决方案似乎是我应该禁用使用 Unicode 字符集。但是,当我这样做时,我收到“不推荐使用为非 Unicode 字符集构建 MFC 项目”错误。寻求帮助,常见的解决方案似乎是我应该启用Unicode字符集。
所以,如果我这样做,我会被灌输,如果我不这样做,我会被灌输。这里的正确做法是什么?
【问题讨论】:
也许你觉得这个有用:***.com/questions/19715144/… 您应该更新整个代码库以正确使用宽字符。实际上这应该在 15 年前完成。 "char*" 仍然是 UTF-8 的标准。大多数软件工程师讨厌“wchar_t*”并为每个字符串表达式添加 L。看起来微软是唯一一个强迫程序员使用 UNICODE 的。微软想停止 MBCS,但我认为这不会很快发生。 @JazzSoft 在这种情况下它与 UTF-8 无关。在 WinAPI 中,您可以使用 UTF-16 或 ASCII。 我的意思是世界上有很多库使用“char*”作为文本字符串,而微软不会停止 MBCS。我开发了多平台库,它基于 MBCS/UTF-8。我不想使用 UNICODE 来开发我的库。如果您使用 UNICODE 编写代码,您的代码可能无法移植到其他操作系统,如 Linux、ios、macOS 等。 【参考方案1】:CreateEvent
本身只不过是一个宏#define
'd 是 WinAPI 的synchapi.h
中实际声明的两个函数之一
#ifdef UNICODE
#define CreateEvent CreateEventW
#else
#define CreateEvent CreateEventA
#endif // !UNICODE
通常(至少在我使用过的所有 Windows 项目中)定义了这个 UNICODE 宏,所以实际上可以使用 CreateEventW
函数,它接受 LPCWSTR
(换句话说,const wchar_t*
),words 参数,它应该是一个 UTF-16 字符串文字。
如果你的项目中没有定义它,那么它使用CreateEventA
,它接受LPCSTR
参数(实际上相当于const char*
),并将其视为ASCII字符串。
您的项目似乎已设置为仅支持 ASCII 字符串。而且...好吧,现在已弃用 :) 以前有一些特殊的附加组件可以为这种情况启用构建,称为 MFC MBCS DLL Add-on。但是,我不能 100% 确定它是否仍然可用,这里是 a question here at *** about that。
如果您没有找到这样的插件或任何类似的替代解决方案,那么恐怕使其编译的唯一方法是将您的项目移植到 Unicode 字符串。实际上,即使您找到了解决方法,如果您打算进一步维护此项目,我建议您将此活动添加到您的待办事项中,因为这种解决方法可能随时不复存在。
无论如何,了解您的最终结果会很有趣。
【讨论】:
我使用的是 Visual Studio 2017,不需要安装 MBCS 插件,尽管 VS 2015 需要它。这意味着微软意识到此时需要 MBCS 支持。【参考方案2】:您使用的似乎是 Microsoft Visual Studio 2013。此版本在分发时没有 MFC 的 MBCS 版本。另一方面,Visual Studio 2015 和 2017 附带 MFC 的 MBCS 版本。
如果你想用 MBCS 构建你的项目,你需要下载并安装这个:
https://www.microsoft.com/en-us/download/details.aspx?id=40770
另一种选择是将整个项目转换为 Unicode,但这可能需要大量工作,具体取决于您的项目。
【讨论】:
VS2015 也有同样的问题以上是关于visual studio c++ UNICODE 相关故障排除循环的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 与 C++ 简单图形用户界面笔记
visual studio的unicode怎么这么恶心啊,我想砸电脑了!
在Visual Studio或GCC中使用表情符号作为c ++中的标识符名称
是否可以在 Visual Studio 2010 项目中使用多个“字符集”?