c++ - _tcslen 和 _tcslen 有什么区别?
问题描述
我开发了一个必须与不同字符集编码兼容的应用程序。为此,我总是使用TCHAR*
而不是char*
定义字符串。因此,我_tcslen
用来获取字符串的大小。
今天,我在公司的版本控制系统上看到,我的一位同事编辑了我写的那一行_tcslen
以_tcsclen
代替使用。
我发现谈论此功能特殊性的唯一链接是这个链接,它没有解释这些功能之间的区别。
_tcslen
有人可以解释一下和之间的区别_tcsclen
吗?
解决方案
_t
前缀意味着这些是映射到不同实现的文本处理函数(实际上是宏),具体取决于您是否正在编译“Unicode”(实际上是 UTF-16)。
当您为 Unicode (_UNICODE
设置 ) 进行编译时,它们映射到相同的函数 ,wcslen
该函数以宽(两字节)字符形式返回字符串的长度。
当您不为 Unicode(_MBCS
设置)编译时,它们映射到不同的函数:
_tcslen
映射到,它以字节strlen
为单位返回字符串的长度。这是为了让您可以分配正确大小的缓冲区。_tcsclen
映射到_mbslen
,其文档相当稀疏。我猜,但是c
in_tcsclen
的意思是字符。
字符和字节之间的区别在于,在多字节编码中,特定字符可以占用一到三个字节。因此:_tcsclen
( _mbslen
) 告诉您字符串中有多少个字符,这对于渲染很有用,并且_tcslen
( strlen
) 告诉您字符串中有多少字节,您需要这些字节来分配内存。
一般来说,如果您主要在 Windows 上工作,您只需为 Unicode 编译并完成它。如果您正在与另一个系统通信(读/写文件、网络消息等),您只需要处理其他字符编码,并且您通常会在 UTF-8 之间进行转换。
请注意,当 Windows SDK 文档提到“多字节”时,它指的是较旧的多字节编码,例如 Shift-JIS,而不是 UTF-8(也是一种多字节编码)。
推荐阅读
- c++ - 动态绑定、静态绑定、函数指针、深层含义
- r - 如何动态分配反应对象的名称?
- wampserver - 无法删除 Wampserver 中的虚拟主机,因为虚拟主机所在的存储设备已损坏
- javascript - 如何在javascript中将id添加到onclick事件中
- cocos2d-x - proj.win32中没有sln文件
- kubernetes-ingress - 即使在解决问题后,Google Kubernetes Ingress 也会显示状态错误
- c# - 在 C# Windows 窗体中单击时如何停止文本在按钮中移动?
- postgresql - how to resolve function datediff(unknown, timestamp without time zone, timestamp without time zone) does not exist
- reactjs - 向“handleSubmit”注入自定义道具/方法的方法?
- node.js - ejs 问题“data.result.forEach 不是函数