unicode转换

Unicode字符集下CString与char *转换

VC++.NET 2009-05-16 15:21:05 阅读1132 评论3   字号: 订阅

         在Visual C++.NET2005中,默认的字符集形式是Unicode,但在VC6.0等工程中,默认的字符集形式是多字节字符集(MBCS:Multi-Byte Character Set),这样导致在VC6.0中非常简单实用的各类字符操作和函数在VS2005环境下运行时会报各种各样的错误,这里总结了在Visual C++.NET2005环境中Unicode字符集下CString和char *之间相互转换的几种方法,其实也就是Unicode字符集与MBCS字符集转换。

1、Unicode下CString转换为char *

方法一:使用API:WideCharToMultiByte进行转换

             CString str = _T("D://校内项目//QQ.bmp");

             //注意:以下n和len的值大小不同,n是按字符计算的,len是按字节计算的
             int n = str.GetLength();     // n = 14, len = 18

             //获取宽字节字符的大小,大小是按字节计算的
             int len = WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);

             //为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小
             char * pFileName = new char[len+1];   //以字节为单位

             //宽字节编码转换成多字节编码
             WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),pFileName,len,NULL,NULL);

             pFileName[len+1] = '/0';   //多字节字符以'/0'结束

方法二:使用函数:T2A、W2A

             CString str = _T("D://校内项目//QQ.bmp");

             //声明标识符
             USES_CONVERSION;

             //调用函数,T2A和W2A均支持ATL和MFC中的字符转换
             char * pFileName = T2A(str);  
             //char * pFileName = W2A(str);  //也可实现转换

            注意:有时候可能还需要添加引用#include  <afxpriv.h>

2、Unicode下char *转换为CString

方法一:使用API:MultiByteToWideChar进行转换

              char * pFileName = "D://校内项目//QQ.bmp";

              //计算char *数组大小,以字节为单位,一个汉字占两个字节
              int charLen = strlen(pFileName);

              //计算多字节字符的大小,按字符计算。
              int len = MultiByteToWideChar(CP_ACP,0,pFileName,charLen,NULL,0);

              //为宽字节字符数组申请空间,数组大小为按字节计算的多字节字符大小
              TCHAR *buf = new TCHAR[len + 1];

              //多字节编码转换成宽字节编码
              MultiByteToWideChar(CP_ACP,0,pFileName,charLen,buf,len);

              buf[len] = '/0';  //添加字符串结尾,注意不是len+1
 
              //将TCHAR数组转换为CString
              CString pWideChar;
              pWideChar.Append(buf);

              //删除缓冲区
              delete []buf;

方法二:使用函数:A2T、A2W

              char * pFileName = "D://校内项目//QQ.bmp";

              USES_CONVERSION;
              CString s = A2T(pFileName);

              //CString s = A2W(pFileName);

方法三:使用_T宏,将字符串转换为宽字符

            //多字节字符集,在vc6和vc7种可以编译通过的语句,但VS2005不能通过,默认为Unicode字符集
            //AfxMessageBox("加载数据失败",0);

            //书写代码使用TEXT("")或_T(""),文本在UNICODE和非UNICODE程序里都通用
            AfxMessageBox(_T("加载数据失败"),0);  

      注意:直接转换在基于MBCS的工程可以,但在基于Unicode字符集的工程中直接转换是不可行的,CString会以Unicode的形式来保存数据,强制类型转换只会返回第一个字符。

TrackBack:http://topic.csdn.net/t/20050608/14/4068106.html

                    http://houjixin.blog.163.com/blog/static/35628410200922595225193/

                    http://hi.baidu.com/flobert_young/blog/item/6f93fd0a3ec83f1894ca6b50.html

                    http://hi.baidu.com/proworkspace/blog/item/50cdee44b03f1d86b2b7dc44.html

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

 

 

在VC6中有时需要创建Unicode版本,而工程中默认的两个版本Debug和Release版本都不是Unicode的, 这就需要自己来创建新的版本配置。
创建新的配置之前,有两个问题先必须明确,一是编译Unicode版本必须要安装Unicode库,如果在安装VC6时没有选择,则要重新添加;二是Unicode版本程序入口为wWinMainCRTStartup,而不是通常的入口WinMain。
在VC6中创建一个MFC Dialog工程,下面是创建Unicode版本的操作步骤:


1.Build-->Configurations-->Add,添加一个Unicode Debug配置;


2.Build-->Set Active Configuration,选择Win32 Unicode Debug作为当前活动配置;


3.在Project-->Settings,在C/C++属性页中选择Preprocessor条目,在Preprocessor definitions中添加编译项 _UNICODE;
如果此时就编译,就会立生错误:
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
还要进行下面操作:


4.在上一步中,在Link属性页中选择Output条目,在Entry-point symbol中填入 wWinMainCRTStartup;


5.OK,重新编译,通过。

 

用VC6进行UNICODE编程

最近试图将自己的程序编译成Unicode版本,费了不少力气,相关内容整理如下,适用于VC6,但VC7、VC8

应该也差不多的(后者新建项目缺省即按Unicode编译)。

1. 添加 UNICODE 和 _UNICODE 预处理定义

位置:Project Settings -> C/C++ -> Preprocessor definitions

添加了这两个定义后,MFC的一些内置类型如 TCHAR、CString 都将转为支持宽字符类型(wchar_t)

2. 使用宽字符相关类型,如:

char -> TCHAR、char * -> LPTSTR、const char * -> LPCTSTR

3. 对字符串常量使用 _T() 宏

4. 替换C库中的中字符串操作函数,如 strlen -> _tcslen、strcmp -> _tcscmp 等

类似的还有C库中字符串与数字的转换函数,如 atoi -> _ttoi、itoa -> _itot 等

5. 将 Project Settings -> Link -> Output -> Entry Point 设为 wWinMainCRTSTartup

否则会有如下错误:
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16

6. C++标准库中的string,有对应的宽字符版本wstring,两者均为basic_string的特化版本

可在StdAfx.h中:

#ifdef _UNICODE
#define tstring wstring
#else
#define tstring string
#endif

然后在代码中使用 tstring 即可,类似的还有 fstream/wfstream、ofstream/wofstream 等

7. 宽字符版本的英文字符仍可直接与整型值进行比较,如:

CString s = _T("ABC");
ASSERT(s[0] == 'A');

8. 对于仍需使用ANSI字符串的地方,如第三方类库的接口,仍可继续使用;如需进行Unicode字符串和

ANSI字符串的互转换,可使用 MultiByteToWideChar 和 WideCharToMultiByte

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值