如何在 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 Set
或 Use 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++ 中关闭自动选项卡开关/案例?
如何在我的新 Spring Boot 项目中关闭 Spring Security?
eclipse如何在workspace中关闭、打开project?