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 形式。

  1. 调用 MultiByteToWideChar,为pWideCharstr参数传入NULL,为cchWideChar参数传入0,为cbMultiByte参数传入-1。
  2. 分配一块足以容纳转换后的 Unicode 字符串的内存,大小是上一个MultiByteToWideChar调用的返回值乘以sizeof(wchart)。
  3. 再次调用 MutiByteTowideChar,这一次特级冲区地址作为 pwideCharStr 参数的值传入,将第一次 MultiByteToWideChar调用的返回值乘以sizeofwchar D后得到的大小作为cchWideChar 参数的值传入。
  4. 使用转换后的字符串。
  5. 释放 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 值。

 

posted @   过往云烟吧  阅读(271)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示