关于ANSI 和UNICODE

ANSI字符集是采用单字节表示的,也称为窄字符,是计算机发展初期阶段的编码产物,体现在WIN* 9X及其以前的操作系统中.

Unicode字符集是采用双字符节表示的,也称为宽字符,它不但兼容ANSI,而且还包含阿拉伯文,中文拼音,日俄韩等多国文字和大量标点符号. NT系列的2000,2003,XP等操作系统内核都采用Unicode字符集.

  使用Unicode编程是发展的必然趋势,ANSI也位列淘汰之首,但现在使用win9x系列的用户仍然不在少数,所以考虑到程序的移植性,应该培养编写代码时,同时兼容ANSI和Unicode的习惯.

 

1.使用宏 _T

   如果在程序中以下方式定义了一个字符串:

   "In China"         // 那么编译器将把它看做个ANSI字符串

   而如下方式:

   L"In China"       //  则编译器将使用Unicode字符集.

   为此MFC定义了一个宏 _T,形式如下:

    #ifdef _UNICODE

    #define _T(x)   L##(x)

    #else

    #define _T(x)  (x)

    #endif

   _T("In China")    //使用宏_T

   如果定义了符号_UNICODE,则使用Unicode字符集,否则就使用ANSI字符集.

2.使用类型 TCHAR

   ANSI C提供了对Unicode支持,并定义了一个wchar_t类型,其原型如下:

   typedef unsigned short  wchar_t 

   对应的字符操作函数也由str开头变为wcs开头,如:

   strcpy   <----->  wcscpy

   strchr    <----->  wcschr

   .....

   为了方便代码的编写,MFC提供了TCHAR类型,定义如下:

    #ifdef _UNICODE

    typedef wchar_t TCHAR

    #else

    typedef char  TCHAR

    #endif

   其意义同上.

   相对应的函数以_tcsXXX开头:

   _tcslen, _tcsstr,_tcscpy ...

   以上这些MFC定义的宏,都是为提高程序的可移植性而服务的,如果要编写兼容ANSI和Unicode的代码,应遵循以下几点

A.字符类型定义都以TCHAR或PTSTR型指定

B.原字符都使用宏_T()

C.字符操作函数尽量使用_tcs开头的宏

      windows API也提供几个字符串操作函数

      lstrlen,  lstrcpy,  lstrcmp,  lstrcmpi ,lstrcat

     这些函数也是以宏的形式实现的,分别对应着Unicode版本(lstrXXXW)和ANSI版本(lstrXXXA)

     其中lstrcmp,lstrcmpi 的内部运行方式和_tcscmp不一样,详细信息可参看windows内核编程或  MSDN.

D.尽量使用windows提供的宏定义的类型或函数

   windows不仅提供了以上宏实现的函数,也同样提供了islower, isupper类似功能的IsCharLower...

   等通用版本

3. ANSI 与UNICODE之间的转换

   ANSI to UNICODE:

   int MultiByteToWideChar(

   UINT CodePage,           // 代码页号 通常使用CP_CAP

    DWORD dwFlags,         //设置一些标志符 ,通常0

    LPCSTR lpMultiByteStr,  //源字符串地址

    int cchMultiByte,       //源字符串长度

    LPWSTR lpWideCharStr,   //目标字符串地址

    int cchWideChar         //目标串长度

);

 

UNICODE To ANSI :

int WideCharToMultiByte(
  UINT CodePage,         // 同上

  DWORD dwFlags,         //同上

  LPCWSTR lpWideCharStr,

  int cchWideChar,

  LPSTR lpMultiByteStr, 

  int cchMultiByte,

 LPCSTR lpDefaultChar,  //不能转换某个字符时采用的替换字符,默认是'?'

  LPBOOL lpUsedDefaultChar   //如果全部转换成功则为FALSE 否则为TRUE
);
以上两个函数都可以先以目标串地址为空,长度为0,调用得到所需转换空间后,再动态申请空间,然后再次调用.

 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值