cahr 和 wchar_t

char和wchar_t

char 和 wchar_t 都是 C++ 中的字符类型,但它们之间有一些区别。
char 是一个字节(8 位)长,而 wchar_t 是两个字节(16 位)或四个字节(32 位)长,具体取决于编译器和操作系统。
因此,wchar_t 可以表示更多的字符,包括 Unicode 字符。

在 Windows 操作系统中,许多 API 函数都使用 wchar_t 类型的字符串参数。如果需要处理 Unicode 字符或调用这些函数,则应使用 wchar_t 类型。否则,可以使用 char 类型。

为了使程序适配多语言场景,不建议在代码中使用char或wchar_t,可直接使用TCHAR类型定义字符(串),需要包含对应头文件<TCHAR.H>(在包含了Windows.h时则不需要)。TCHAR在源码中的定义如下:

1
2
3
4
5
#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif

同理,在涉及到字符串操作的接口时,也推荐使用支持多语言场景的接口_tcscpy、_tcslen、_tcscat,而不是strcpy_s、strlen_s、strcat_s或wcscpy、wcslen、wcscat。头文件<TCHAR.H>中有很多类似的宏定义。

前缀L 和 前缀_T

通常,我们使用双引号标识ANSI字符串,比如:”I’m an example. “ 这种类型的字符串,每个字符占用一个字节。当我们想要标识UNICODE字符串时,需要添加前缀L,比如:L”I’m an example. “ 。这种类型的字符串,每个字符占用两个字节。当然,为了适配多语言场景,也设计了一个通用的字符串前缀,即_T(或TEXT),这个前缀也是宏定义,其在源码中的定义如下:

1
2
3
4
5
6
7
#ifdef _UNICODE 
#define _T(c) L##c
#define TEXT(c) L##c
#else
#define _T(c) c
#define TEXT(c) c
#endif

WCHAR LPCTSTR LPSTR LPWSTR

WCHAR是一种Unicode编码类型,其在源码中的定义如下:

1
2
3
4
5
#if !defined(_NATIVE_WCHAR_T_DEFINED)
typedef unsigned short WCHAR;
#else
typedef wchar_t WCHAR;
#endif

LPCTSTR是一种指针类型,该类型名可按照如下方式解读:
LP - Pointer, C - Constant, T - TCHAR, STR - String.
根据我们创建工程时的配置,LPCTSTR会映射为LPCSTR(ANSI)或LPCWSTR(Unicode)。

LPSTR是一种指针类型,可能指向的数据编码类型为 ANSI 或 UTF-8,具体由protocol文件决定。LPSTR在源码中的定义如下:
typedef char* PSTR, *LPSTR;

LPWSTR也是一种指针类型,它用32位字符表示16位的Unicode字符,其在源码中的定义如下:

1
typedef wchar_t* LPWSTR, *PWSTR;

_stprintf_s

_stprintf_s() 函数的第一个参数是要格式化的字符串,第二个参数是要插入到字符串中的值。

1
2
3
4
#ifdef UNICODE
#define _stprintf_s swprintf_s
#else
#define _stprintf_s sprintf_s
1
2
TCHAR str[256];
_stprintf_s(str, _T("(%f,%f,%f)"), pt[0], pt[1], pt[2]);

文章目录

  1. char和wchar_t
    1. char 和 wchar_t 都是 C++ 中的字符类型,但它们之间有一些区别。char 是一个字节(8 位)长,而 wchar_t 是两个字节(16 位)或四个字节(32 位)长,具体取决于编译器和操作系统。因此,wchar_t 可以表示更多的字符,包括 Unicode 字符。
    2. 在 Windows 操作系统中,许多 API 函数都使用 wchar_t 类型的字符串参数。如果需要处理 Unicode 字符或调用这些函数,则应使用 wchar_t 类型。否则,可以使用 char 类型。
    3. 为了使程序适配多语言场景,不建议在代码中使用char或wchar_t,可直接使用TCHAR类型定义字符(串),需要包含对应头文件<TCHAR.H>(在包含了Windows.h时则不需要)。TCHAR在源码中的定义如下:
    4. 同理,在涉及到字符串操作的接口时,也推荐使用支持多语言场景的接口_tcscpy、_tcslen、_tcscat,而不是strcpy_s、strlen_s、strcat_s或wcscpy、wcslen、wcscat。头文件<TCHAR.H>中有很多类似的宏定义。
  2. 前缀L 和 前缀_T
    1. 通常,我们使用双引号标识ANSI字符串,比如:”I’m an example. “ 这种类型的字符串,每个字符占用一个字节。当我们想要标识UNICODE字符串时,需要添加前缀L,比如:L”I’m an example. “ 。这种类型的字符串,每个字符占用两个字节。当然,为了适配多语言场景,也设计了一个通用的字符串前缀,即_T(或TEXT),这个前缀也是宏定义,其在源码中的定义如下:
  3. WCHAR LPCTSTR LPSTR LPWSTR
    1. WCHAR是一种Unicode编码类型,其在源码中的定义如下:
    2. LPCTSTR是一种指针类型,该类型名可按照如下方式解读:LP - Pointer, C - Constant, T - TCHAR, STR - String.根据我们创建工程时的配置,LPCTSTR会映射为LPCSTR(ANSI)或LPCWSTR(Unicode)。
    3. LPSTR是一种指针类型,可能指向的数据编码类型为 ANSI 或 UTF-8,具体由protocol文件决定。LPSTR在源码中的定义如下:typedef char* PSTR, *LPSTR;
    4. LPWSTR也是一种指针类型,它用32位字符表示16位的Unicode字符,其在源码中的定义如下:
  4. _stprintf_s
    1. _stprintf_s() 函数的第一个参数是要格式化的字符串,第二个参数是要插入到字符串中的值。