如何在 VC++ 项目中关闭 Unicode?

Posted

技术标签:

【中文标题】如何在 VC++ 项目中关闭 Unicode?【英文标题】:How do I turn off Unicode in a VC++ project? 【发布时间】:2010-11-22 02:40:59 【问题描述】:

我在 Visual Studio 2008 中有一个 VC++ 项目。

它在编译器命令行 (/D "_UNICODE" /D "UNICODE") 上定义 unicode 的符号,即使我没有在项目的预处理器部分打开此符号。

因此,我针对所有 Win32 库函数的 Unicode 版本进行编译,而不是 ANSI 版本。例如在 WinBase.h 中,有:

#ifdef UNICODE
#define CreateFile  CreateFileW
#else
#define CreateFile  CreateFileA
#endif // !UNICODE

VC++项目中的unicode在哪里开启,如何关闭呢?

【问题讨论】:

现在真正的问题是:为什么——看在上帝的份上——你会希望从禁用 UNICODE 支持中获得什么?这一定是我第一次看到有人在进入故障模式时寻求帮助。 如果您有遗留代码需要支持?例如,从 15 年前开始,我们有一堆可互换使用 char/TCHAR 的库。 @ThomasEding:在 Windows 上,wchar_t 是 Unicode/UTF-16LE 编码的同义词。糟糕与否,它是 Windows 中的本机字符编码,通过 Windows API 公开。如果你想与它互动,你最好学会欣赏它。顺便说一句,.NET 字符串也使用 UTF-16 编码。 NTFS 也是如此。或 Java 字符串。 在使用 C++ 时,我将使用 C++ UTF-8 库,谢谢。现在我的代码也可以在 Linux 上运行。奇迹! 您可以随心所欲地使用 C++ UTF-8 库,但您仍然必须将这些 UTF-8 字符串转换为 UTF-16 字符串才能与平台的原生 API 交互。因此,定义 UNICODE 有助于确保您不会弄错并意外地将 UTF-8 字符串(键入为 char)传递给期望 ANSI 字符串(也键入为 char,非常不同)的 API 函数来自 UTF-8)。请注意,与某些程序员的期望相反,UTF-8 不是 Windows 上的有效 ANSI 代码页。 @托马斯 【参考方案1】:

您是否尝试过:项目属性 - 常规 - 项目默认值 - 字符集?

有关“使用多​​字节字符集”和“未设置”选项之间的区别,请参阅此问题的答案:About the "Character set" option in visual studio 2010

【讨论】:

非常感谢。这对我发现但无法编译的项目帮助很大。 再次感谢它保存了我的问题,但默认情况下 UNICODE 并不是很好的举动。! 在 Visual Studio 2019 中:Project Properties > Advanced > Character Set 设置为 Not SetUse Multi-Byte Character Set【参考方案2】:

布尔戈斯有正确的答案。为了澄清起见,字符集应更改为“未设置”。

【讨论】:

【参考方案3】:

项目属性->配置属性->通用->字符集

【讨论】:

【参考方案4】:

从 VS2019 项目属性 - 高级 - 高级属性 - 字符集

如果存在 _UNICODE;UNICODE 预处理器定义,则将它们删除。 项目属性 - C/C++ - 预处理器 - 预处理器定义

【讨论】:

【参考方案5】:

无论出于何种原因,我注意到“所有配置”的设置为 unicode 实际上并不适用于所有配置。

图片:

为了确认这一点,我会打开 .vcxproj 并确认正确的令牌 在所有 4 个位置。在这张照片中,我使用的是 unicode。所以字符串 我正在寻找的是“Unicode”。对您而言,您可能希望它显示“MultiByte”。

图片:

【讨论】:

请勿将代码或文本作为图片发布。在此处复制/粘贴文本【参考方案6】:

在主文件的顶部使用#undef UNICODE

【讨论】:

没有“主文件”这样的东西。有编译单元。在源代码中显式取消定义预处理器符号将丢失通过/FI 编译器选项包含的那些文件。另外,取消定义UNICODE 而不取消定义_UNICODE 将在Windows API 和CRT 之间产生很好的不匹配。相当无用的答案,-1。 也许你的意思是stdafx.h,但这仍然是一个愚蠢的黑客。【参考方案7】:

你可以去项目属性-->配置属性-->常规-->项目默认 并将“字符集”从“Unicode”更改为“未设置”。

【讨论】:

你有什么理由停下来,复制一个 6 年前的答案而不提供任何有价值的东西?当然,无需注明信息来源。【参考方案8】:

以上解决方案都不适合我。 但是

#include <Windows.h>

工作正常。

【讨论】:

什么?您只是包含了 Windows API 标头,而不是禁用 Unicode。

以上是关于如何在 VC++ 项目中关闭 Unicode?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VC2013 for C++ 中关闭自动选项卡开关/案例?

在 SWIFT 中关闭 segue 之前保存变量

如何在我的新 Spring Boot 项目中关闭 Spring Security?

eclipse如何在workspace中关闭、打开project?

在 Kotlin 中关闭应用程序后,如何将 onItemSelected 保留在选中的同一项目上?

在flutter中关闭endDrawer后如何运行功能