_tcslen 和 _tcsclen 有什么区别?

Pie*_*rre 5 c++ winapi function string-length

我开发了一个必须与不同字符集编码兼容的应用程序。为此,我总是使用TCHAR*而不是char*定义字符串。因此我用来_tcslen获取字符串的大小。

今天,我在公司的版本控制系统上看到我的一位同事编辑了我编写的行以代替_tcslen使用_tcsclen

我发现的唯一一个谈论这个函数特殊性的链接是这个,它没有解释这些函数之间的区别。

_tcslen有人可以解释一下和之间的区别_tcsclen吗?

Rog*_*mbe 5

前缀_t意味着这些是映射到不同实现的文本处理函数(实际上是宏),具体取决于您是否针对“Unicode”(实际上是 UTF-16)进行编译。

当您编译 Unicode(_UNICODE已设置)时,它们映射到相同的函数 ,wcslen该函数返回宽(两字节)字符的字符串长度。

当您不针对 Unicode 进行编译(_MBCS已设置​​)时,它们会映射到不同的函数:

  • _tcslen映射到strlen,它返回字符串的长度(以字节为单位)。这样做的目的是为了让您可以分配正确大小的缓冲区。
  • _tcsclen映射到_mbslen,其文档相当稀疏。但我猜测cin的_tcsclen意思是字符

字符和字节之间的区别在于,在多字节编码中,特定字符可以占用一到三个字节。因此:_tcsclen( _mbslen) 告诉您字符串中有多少个字符,这对于渲染很有用,而_tcslen( strlen) 告诉您字符串中有多少个字节,这对于内存分配来说是有用的。

一般来说,如果您主要在 Windows 上工作,您只需针对 Unicode 进行编译即可完成。如果您正在与另一个系统通信(读/写文件、网络消息等),则只需处理其他字符编码,并且通常会在 UTF-8 之间进行转换。

请注意,当 Windows SDK 文档提到“多字节”时,它意味着旧的多字节编码,例如 Shift-JIS,而不是 UTF-8(这也是一种多字节编码)。