首页 > 解决方案 > _tcslen 和 _tcslen 有什么区别?

问题描述

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

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

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

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

标签: c++functionwinapistring-length

解决方案


_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(也是一种多字节编码)。


推荐阅读