char和TCHAR(宽字符和窄字符)
以前用习惯了C#string走天下,在c++就遇到了字符类型的问题,曾一度想回家放牛。
字符集是什么?
ANSI:占八位最多能表示256个符号,只给美国使用是没有问题,但是其他国家的使用就完全不够了,为了支持更多的语言文字系统,双字节字符集就产生了,双字节由1到2个字节组成。
UTF-8:将一些字符集编为1/2/3/4个字节,值在0x0080(256)以下编译为1个字节,0x0080-0x07ff(2047),0x0800以上的编译为3个字节,还不够用就是代理被编译为4个字节,对值为0x0800以上字节进行编译的时候不如UTF-16那么高效。
UTF-16:将一些字符集编为2个字节,不够用的时候,企业代理编译的时候使用的Unicode就是这个格式
UTF-32:全部用4字节编译
Unicode互相转换ANSI
多字节字符转宽字符在windows下使用: MultiByteToWideChar
in MultiByteToWideChar(
UINT uCodePage,
WORD dwFlags,
PCSTR pMultiByteStr,
int cbMultiByte,
PWSTR pwideCharStr,
int cchWideChar);
uCodePage 参数标识了与多字节字符串关联的一个代码页值
dWFlags 参数允许我们进行额外的控制,它会影响带变音符号(比如重音)的字符。但是,一般情况下都不使用这些标志,所以传给 dwFlags 参数的值是 0
pMultiByteStr 参数指定要转换的字符串,
cbMultiByte 参数指定字符串的长度(字节数),如果传给cbMultiByte 参数的值是-1,两数便可白动判断源字符串的长度。
函数将转换所得的 Unicode 版本的宇符串写入内存缓冲区,其内存地址由 pwideCharstr参数所指定
必须在cchWideChar 参数中指定这个缓冲区的最大长度(字符数)。
如果调用MultiByte ToWideChar,并给 cchWideChar参数传入0,西数就不会执行转换,而是返回一个宽字符数(包括终止字符^0),只有当缓冲区能够容纳该数量的宽字符时,转换才会成功。
一般按照以下步骤将一个多字节字符串转换为 Unicode 形式。
- 调用 MultiByteToWideChar,为pWideCharstr参数传入NULL,为cchWideChar参数传入0,为cbMultiByte参数传入-1。
- 分配一块足以容纳转换后的 Unicode 字符串的内存,大小是上一个MultiByteToWideChar调用的返回值乘以sizeof(wchart)。
- 再次调用 MutiByteTowideChar,这一次特级冲区地址作为 pwideCharStr 参数的值传入,将第一次 MultiByteToWideChar调用的返回值乘以sizeofwchar D后得到的大小作为cchWideChar 参数的值传入。
- 使用转换后的字符串。
- 释放 Unicode 字符串占用的内存块。
两数将宽宁符字符串转换为多字节宇符串使用WideCharToMultiByte
in WideCharToMultiByte(
UINT uCodePage,
DWORD dwFlags
PCWSTR pWideCharStr,
int cchWideChar,
PST pMultiByteStr,
int cbMultiByte,
PCSTR pDefaultChar,
POOL pfUsedDefaultChar);
与MultiByteToWideChar函数相比,WideCharToMultiByte函数接受的参数要多两个,分别是pDefaultChar和prUsedDefaultChar。只有一个字符在uCodePage指定的代码页中没有对应的表示时,WideCharToMultiByte函数才会使用这两个参数。
在遇到一个不能转换的宽字符时,函数便使用 pDefaultChar参数指向的字符。如果这个参数为NULL(这是很常见的一个情况),函数就会使用一个系统默认的字符。这个默认字符通常是一个问号。这对文件名来说非常危险,因为问号是一个通配符。
prUsedDefaultChar 参数指向一个布尔变量;在宽字符字符串中,如果至少有一个字符不能转换为对应的多字节形式,啊数就会把这个变量设为TRUE。如果所有字符都能成功转换,就会把这个变量设为 FALSE。我们可以在两数返回后测试该变量,验证宽字符字
待串是否己成功转换。同样地,我们通常为此参数传入 NULL 值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)