Win32-00 Windows编程前奏--字符串编码

对于Windows编程,几乎所有的API函数都提供了两种版本 ***A 和***W,前者是采用 ANSI编码来处理字符串,后者采用的是 Unicode.

在学习C/C++的时候,我们使用的大都是ANSI编码的函数,而Windows处于国际化标准的原因,内部采用了Unicode编码。这对于我们从ANIS C++转换到Windows的VC造成了困难。于是我认为,学习字符串处理,编码转换是学好Windows编程的基础。

以下作一个简单的介绍:

一,字符编码

目前使用的编码主要为以下三种:

1,UTF-8(即多字节)

UTF-8将一些特殊字符编码为1个字节,一些字符编码为2个字节,一些为3个字节,甚至还有少数为4个字节。

值在0x0080以下的字符压缩为1个字节,这对老美非常适用。

值在0x0080到0x07FF之间的字符转换为2个字节,这对欧洲地区非常适合。

值在0x0800以上的字符都转换为3个字节。适合东亚地区的语言。

最后,代理对(surrogate paid)编码为4个字节。


2,UTF-16(即Unicode字符采用的编码方式)

这种编码将所有字符全部编码为2个字符,可以便于机器的处理。对于0x0080以上的字符,它无疑是提升了计算机处理的性能。

(Unicode本地化:显然2个字符不可能编码世界所有的文字,于是各个地区对某些字符本地化,使其能适应自身需求)

3,UTF-32

它将所有字符编码为4个字节。这样,世界就是一家了。可是这太浪费空间了,目前不常用。


二,ANSI 字符和 Unicode字符 与字符串数据类型

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

ANSI:                        char c = 'A'             //一个8位字符

                                     char szBuffer[] = "A String"

Unicode:                     wchar_t ch = L'A';     // 一个16位的字符

                                     wchar_t szBuffer = L"A string"

另外对于类型 CHAR WCHAR TCHAR  在头文件WinNT.h中可以找到如下定义

typedef char CHAR

typedef wchat_t WCHAT


#ifdef UNICODE

typedef WCHAR   TCHAR

#else

typedef CHAR     TCHAR


显而易见,TCHAR 是一个根据系统环境变化的类型,为了增强程序的可移植性,应当使用TCHAR。


补充:

Windows中自定义了大量的数据类型。

P: pointer

C: const

STR: char[]

T: char 或者wchar_t

例如PTSTR: 指向一个字符串的指针                              PCTSTR 指向一个常字符串的指针


三,ANSI与Unicode 转换

Windows提供了两个API函数来完成

int MultiByteToWideChar( 

  UINT CodePage,         // code page
  DWORD dwFlags,         // character-type options
  LPCSTR lpMultiByteStr, // string to map
  int cbMultiByte,       // number of bytes in string
  LPWSTR lpWideCharStr,  // wide-character buffer
  int cchWideChar        // size of buffer

);

int WideCharToMultiByte( 

  UINT CodePage,            // code page
  DWORD dwFlags,            // performance and mapping flags
  LPCWSTR lpWideCharStr,    // wide-character string
  int cchWideChar,          // number of chars in string
  LPSTR lpMultiByteStr,     // buffer for new string
  int cbMultiByte,          // size of buffer
  LPCSTR lpDefaultChar,     // default for unmappable chars
  LPBOOL lpUsedDefaultChar  // set when default char used

);

具体用法可参阅MSDN.

值得一提的是,对于ANSI与Unicode,Windows API中,都是*****A 内部首先调用 WideCharToMultiByte 转换参数提供给***W版本,然后将结果WideCharToMultiByte后再返回给用户。


四,字符串处理的变化

标准C提供的字符串处理函数已经不能适应Windows 下Unicode的平台了,于是Windows提供了相对应的函数。

strlen            --------------------------------   wcslen

strcat            --------------------------------  wcscat

等等。

同时,还有一组安全的字符串函数:

****_s

例如  _tcscpy_s

类似的函数还有很多,具体参阅CSDN


另外:Windows支持shell字符串处理函数

http://msdn.microsoft.com/en-us/library/ms538658.aspx


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值