_tcslen 和 _tcsclen 有什么区别?

What is the difference between _tcslen and _tcsclen?

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

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

我发现唯一 link 人在谈论这个功能的特殊性 this one 并且它没有解释这些功能之间的区别。

谁能解释一下 _tcslen_tcsclen 之间的区别?

When the Windows _MBCS compiler flag is set, _tcslen maps to strlen and _tcsclen maps to _mbslen. When the Windows _UNICODE flag is set, the Generic functions both map to wcslen.

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

当您为 Unicode 编译时(_UNICODE 已设置),它们映射到相同的函数 wcslen,returns 字符串的长度在宽(两个-byte) 个字符。

当您不为 Unicode 编译时(_MBCS 已设置),它们映射到不同的函数:

  • _tcslen 映射到 strlen,其中 returns 字符串的长度 字节 。这是为了让您可以分配正确大小的缓冲区。
  • _tcsclen 映射到 _mbslen,其文档相当稀疏。我 猜测 ,但是 _tcsclen 中的 c 的意思是 个字符 .

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

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

请注意,当 Windows SDK 文档提到 "multi-byte" 时,它表示旧的多字节编码,例如 Shift-JIS,而不是 UTF-8(即 也是多字节编码)。