什么是Visual Studio中的字符集

What is character set in Visual Studio?

本文关键字:字符集 Studio Visual 什么      更新时间:2023-10-16
这可能是

一个基本问题,但由于某些原因,我不太明白。

问题是:Visual Studio 中的 "Character Set" 属性实际上是什么?(例如,您可以设置为:Use Unicode Character SetUse Multi-Byte Character SetNot Set - 在属性中)

我或多或少知道 Unicode 是什么,但为什么我们需要设置此属性?

例如,如果我不设置它并在项目中使用L"hello"类型的字符串,那将没有意义吗?

在Visual Studio中设置Character Set选项将为您定义几个预处理器符号:

  • Unicode将定义_UNICODE
  • Use Multi-byte Character Set将定义_MBCS
  • Not Set不会定义其中任何一个。

现在,如果您查看SDK中的一些头文件,您将看到以下一堆:

#ifdef _UNICODE
#define GetDeltaInfo                        GetDeltaInfoW
#else
#define GetDeltaInfo                        GetDeltaInfoA
#endif /* _UNICODE */

其中 W 和 A 函数为:

BOOL
WINAPI
GetDeltaInfoA(
    __in LPCSTR lpDeltaName,
    __out LPDELTA_HEADER_INFO lpHeaderInfo
    );
/**
 * Gets header information for a delta accessed by Unicode file name.
 * @param lpDeltaName   Delta file name, Unicode.
 * @param lpHeaderInfo  Header information for given Delta.
 * @return              TRUE if success, FALSE otherwise.
 */
BOOL
WINAPI
GetDeltaInfoW(
    __in LPCWSTR lpDeltaName,
    __out LPDELTA_HEADER_INFO lpHeaderInfo
    );

因此,通过设置 Unicode 或多字节,您将选择正确的函数集。

当你这样做时,例如 L"Hello"创建宽字符串。要使用它,您必须对单个字符使用 std::wstringwchar_t

在Visual Studio中不要使用例如 L"Hello"直接使用T宏,例如T("Hello"),它将根据您的"字符集"设置执行正确的操作。您还应该使用 TCHAR 而不是 charwchar_t 。虽然没有C++标准的字符串类型,因为它是Visual Studio特定的扩展,但你可以例如

typedef std::basic_string<TCHAR> tstring;

设置 Unicode 字符集时,编译器将#define_UNICODE并使用wchar_t宽字符串和字符。选择多字节字符后,将不会定义_UNICODE,而是_MBCS定义,并且TCHAR将是正常的char。如果选择不使用其中任何一个,则不会定义任何宏,而是使用普通char

例如,请参阅此链接以获取更多信息。

Microsoft 风格的 c 运行时和 Windows API 的标头定义了几个宏和 typedef,这些宏和 typedef 的计算结果取决于此设置的多字节或宽字符变体。例如,在

int _tmain(int argc, _TCHAR* argv[]);

_TCHAR定义如下(简化):

#ifdef  _UNICODE
typedef wchar_t     _TCHAR;
#else
typedef char     _TCHAR;
#endif

这样,相同的代码可以用于多字节和 Unicode 构建。 _UNICODE选择"使用 Unicode 字符集"时定义,如果选择"多字节",则不会定义。