【问题标题】:How do I turn off Unicode in a VC++ project?如何在 VC++ 项目中关闭 Unicode?
【发布时间】: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 代码页。 @托马斯

标签: visual-studio unicode visual-c++


【解决方案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。
        猜你喜欢
        • 1970-01-01
        • 2011-10-05
        • 2013-12-20
        • 2010-09-30
        • 1970-01-01
        • 2013-08-07
        • 1970-01-01
        • 2013-05-12
        相关资源
        最近更新 更多