_tcslen和_tcsclen有什么区别?

5
我正在开发一个应用程序,需要兼容不同的字符集编码。为了做到这一点,我总是使用TCHAR*而不是char*来定义字符串。因此,我使用_tcslen来获取我的字符串的大小。
今天,我在公司的版本控制系统中看到我的一位同事编辑了我写的那行代码,改用_tcsclen
我找到的唯一一个谈论这个函数特殊性的链接是这个,但它并没有解释这两个函数之间的区别。
有人能解释一下_tcslen_tcsclen之间的区别吗?

在您发布的链接中,它们根据 #define 映射到不同的函数。如果您需要 MBCS 支持,那么我认为您的同事是正确的。请参阅备注部分。 - Richard Critten
@RichardCritten 我相信他是正确的。确实,我们需要MBCS,因为我猜应用程序是跨平台的,并接受不同的字符集。但我真的不明白为什么我们应该优先选择 _tcsclen 而不是 _tcslen。它们之间有什么区别?在哪些情况下应该使用其中之一? - Pierre
1
很少有必要使用TCHAR。我猜你不支持Windows 9x。 - David Heffernan
1
考虑到长度可能被用于内存而非渲染(谁会手动这样做呢?)目的,这位同事可能是错误的,并引入了一个严重的 bug。 - Chris Becke
2个回答

5
_t前缀表示这些是文本处理函数(实际上是宏),根据编译是否为“Unicode”(实际上是UTF-16),它们会映射到不同的实现。
当您编译为Unicode(设置_UNICODE时),它们映射到相同的函数wcslen,该函数返回字符串中宽(两字节)字符的长度。
当您未编译为Unicode(设置_MBCS时),它们映射到不同的函数:
  • _tcslen映射到strlen,该函数返回字符串中字节的长度。这意味着您可以分配正确大小的缓冲区。
  • _tcsclen映射到_mbslen,其文档相当稀少。然而,我猜测_tcsclen中的可能是指字符
字符和字节之间的区别在于,在多字节编码中,特定字符的字节数可以介于1和3之间。因此:_tcsclen_mbslen)告诉您字符串中有多少个字符,这对于渲染很有用,而_tcslenstrlen)告诉您字符串中有多少个字节,这是内存分配所需的。
通常,如果您主要在Windows上工作,只需为Unicode编译即可完成。仅当与另一个系统交互(读/写文件,网络消息等)时,您才需要处理其他字符编码,并且通常会转换为和从UTF-8。
请注意,当Windows SDK文档提到“多字节”时,它指的是旧的多字节编码,例如Shift-JIS,而不是UTF-8(它也是一种多字节编码)。

“Unicode(实际上是UTF-16)”我想并不一定正确。你也可以将Unicode字符编码为UTF-8,对吧? - Vijay Chavda
1
在Windows中,“编译为Unicode”意味着UTF-16。那时还没有发明UTF-8。 - Roger Lipscombe
_tcslen中的c代表const。这意味着它可以给出一个const字符串指针的长度,不管它是const char *还是const wchar_t *。 - Jonathan

1
当设置Windows的_MBCS编译器标志时,_tcslen映射到strlen,_tcsclen映射到_mbslen。当设置Windows的_UNICODE标志时,通用函数都映射到wcslen。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接