MSVC工程里Unicode字符集和多字节字符集选项
在Visual Studio的C++工程中,有个一选项可以设置当前工程的字符集,本文主要围绕着该设置置项展开。
Unicode和MBCS
该选项主要是针对MFC库中函数的来设置的,用于支持国际化的多语言开发。例如,中文的字符集就很大,MFC库提供了Unicode和MBCS来解决这个问题。
- Unicode 是基于
wchar_t的宽字节字符串,其中的字符以UTF-16方式进行编码。
- MBCS 全称为Multibyte Character Sets,是基于
char的单字节字符或多字节字符串,其中的字符以本地 locale-specific 的字符集进行编码的。
微软推荐使用Unicode版本的MFC库进行开发。实际上Windows底层使用的是 wchar_t 字符串,当一些老软件调用Win32底层API时,其中的 char 字符串会被转化为 wchar_t 字符串。
CString 和 TCHAR
CString 是基于 TCHAR 的数据结构, TCHAR 会根据当前配置来决定其底层的数据类型。当存在 _UNICODE 宏定义时是Unicode字符集模式,在Unicode下是 wchar_t 16bit字符格式;当存在 _MBCS 宏定义时是多字节字符集模式,在MBCS下是 char 常用的8bit字符格式。
tips: _UNICODE 和 _MBCS 是互斥的,不要同时定义二者。
在以Unicode字符集模式下进行开发时,需要注意以下几点:
- 使用
_T宏将字符串转为Unicode编码
- 在使用字符串时,需要额外注意字符个数与字符字节数,在Unicode字符串中二者是不同的
- 使用
TCHAR代替char,LPTSTR代替char*,LPCTSTR代替const char*
std::string 和 std::wstring
std::string 是以 char 实例化的 basic_string 模板,而 std::wstring 是以 wchar_t 实例化的。
-
char类型用于存储一个字符,通常是8比特(bit)的。
-
wchar_t类型用于存储宽字符,它在linux下是4字节(byte)的,在windows下是2字节的。
-
char和wchar_t一般都没有直接和字符集关联在一起的;可以理解为它们仅提供存储数据的容器,并没有限定存储数据的字符集。