_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(即 也是多字节编码)。
我开发了一个必须兼容不同字符集编码的应用程序。为此,我总是使用 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(即 也是多字节编码)。