【Windows学习】Windows核心编程-字符编码

Windows的字符编码主要有以下几个注意点

1.Windows Vista 中每个Unicode字符都是 UTF-16编码, 且是默认编码。.Net Framework始终使用UTF-16来编码。

    开发Windows程序中,如果需要本机代码和托管代码之间传递字符或字符串,使用UTF-16可以改进性能减少内存消耗

2.C语言中char数据类型表示一个8位的ANSI字符,

  Microsoft C/C++ 编译器又定义了一个内建的数据类型wchar_t表示16位的Unicode字符

  Windows团队又为了区分自己定义的数据类型,在WinNT.h中定义了 typedef char CHAR; typedef wchar_t WCHAR

3.Windows版本里面的参数列表含有字符串的时候分2个版本末尾带有大写W表示接受Unicode字符串,末尾带有A的表示接受

  ANSI字符串,而接受ANSI字符串的API其实只是一个转换层,负责分配内存,将ANSI字符串转换成Unicode字符串,然后代码

 调用Unicode字符串的API,返回的时候,ANSI会释放它的内存缓冲区,Unicode字符串转换成非Unicode的形式返回回来,

 因此速度比较慢,消耗内存。

4.同样C运行库也提供了一系列函数处理ANSI字符串和Unicode字符串,但是ANSI字符串操作的时候不用转换成Unicode字符串

5.推荐使用的字符和字符串处理方式

  •  通用数据类型TCHAR/PTSTR表示文本字符和字符串,并且PSTR换成PTSTR
  •  明确数据类型BYTE/PBYTE来表示字节,指针和数据缓冲区
  •  TEXT/_T表示字面量字符和字符床,避免两者混用
  •  函数希望传给它的是缓冲区的字符数,而不是字节数的时候用_countof(szBuffer)而不是sizeof(szBuffer)
  •  为一个字符串分配内存块,知道字符串的字符数,但是是以字节来分配,必须调用malloc(nCharacters*sizeof(TCHAR))
  •  避免使用printf系列函数,尤其不要用%s %S来进行ANSI和Unicode的转换,正确的方式是MultiByteToWideChar(ANSI->Unicode),WideCharToMultiByte
  •  UNICODE _UNICODE符号要同时指定或同时不指定。
  •  字符串拷贝等处理函数,最好使用带有_s的安全函数
  •  不用Kernel32的方法进行字符串处理比如lstrcat lstrcpy
  •  用户程序中比较两种字符串用CompareStringOridinal进行比较。

你可能感兴趣的:(windows,字符编码)