wchar_t与char转换

原创 2005年05月02日 02:38:00

        环境:Dev cpp 平台i386

         C++标准中,wchar_t是宽字符类型,每个wchar_t类型占2个字节,16位宽。汉字的表示就要用到wchar_t 。char,我们都知道,占一个字节,8位宽。其实知道了这个以后,要在wchar_t 和 char两种类型之间转换就不难实现了。

         wchar_t 转换为char 的代码如下:

         有如下的wchar_t和char变量

         wchar_t w_cn = '中';
         char c_cn[2] = {'0'} ;

char *C2W(wchar_t w_cn , char c_cn[2])

{   

    //following code convert wchar to char 
    c_cn[0] = w_cn >> 8 ;
    c_cn[1] = w_cn ;
    c_cn[2] = '/0';

    return c_cn ;

}

        其中需要注意的是一个16位的wchar_t需要用两个8位的char来存储之。我们可以发现另外一个问题,wchar_t的高位字节应该存储在char数组的低位字节。(这里没有仔细研究了,觉得怪怪的)。

        这是完成了wchar_t到char的转化,char到wchar_t的转换类似。

        C++中,你要想这样:cout<<w_cn<<endl;打印wchar_t,那是不行的。why?我想是wchar_t类型没有重载<<运算符吧。要显示,我的方法是
        string cn(c_cn);
        cout<<cn<<endl;

这样就能正确的打印wchar_t字符了。是不是感觉好像做了好多事,但是完成的却是很简单的事情?呵呵,其实我也有同感,但是没有办法。更简单的办法,当然是直接用API(我一个是懒的去找了,二一个自己动手转换有些东西看的更清楚咯),但是这样的转换更灵活,在实际中应该会用到的。
        有了以上的基础,下面给出wchar_t字符串到char字符串的转换代码:

char *W2C(const wchar_t *pw , char *pc)
{
 //cout<<*pw<<endl;  //这样是不能正确显示的,你可以试试看显示的是什么
    *pc++ = *pw >> 8 ;
    *pc = *pw ;
    return 0 ;
}
 
char *wstr2cstr(const wchar_t *pwstr , char *pcstr, size_t len)
{
 char *ptemp = pcstr ;
    if(pwstr!=NULL && pcstr!=NULL)
    {
       
        size_t wstr_len = wcslen(pwstr) ;
        len = (len > wstr_len ) ?  wstr_len : len ;
    while( len -- > 0)
    {

        W2C(pwstr , pcstr);
        pwstr++ ;
        pcstr +=2 ;    //和我们开始说的一样+2,不是+1
    }
        *pcstr = '/0';
        return ptemp ;
    }
    return 0 ;
}   

        上面就是代码,测试:

int main(int arg , char *argv[])

{

    wchar_t pwstr[] = {'我' , '是' , '中' , '国' , '人'};
 

    char *pcstr = (char *)new char[2 * wcslen(pwstr)+1] ;
    memset(pcstr , 0 , 2 * wcslen(pwstr)+1 );
    wstr2cstr(pwstr , pcstr , wcslen(pwstr)) ;

    str.assign (pcstr);
    cout<<str<<endl;
    delete []pcstr ;

}

over!

c++中char*\wchar_t*\string\wstring之间的相互转换

string U2A(const wstring& str)//Unicode字符转Ascii字符{ string strDes; if ( str.empty() ) goto __end;...
  • mfcing
  • mfcing
  • 2012年05月02日 23:16
  • 15095

VC++中通过MultiByteToWideChar将string|char*转换为wstring|wchar_t*

原文地址:http://www.cnblogs.com/qq78292959/archive/2010/09/15/2077015.html #include #include using na...
  • ljh0302
  • ljh0302
  • 2015年12月31日 10:49
  • 297

wchar_t与char(系统默认编码集,非UTF8)的转换

最近开始看孙鑫老师的c++视频,在跟着视频做东西的时候,碰到了这个问题,视频中应该没有定义UNICODE,所以它里面的字符串就是简单用" "就行了,但是我在自己电脑上编译时,就碰到了问题,就因为创建工...

wchar_t*和char*的转换

wchar_t *WStr = L"string to convert"; size_t len = wcslen(WStr) + 1; size_t converted = 0; char *CSt...

QT 总结(一)(1.某位设1或0 2.加载dll、lib库 3.char * 转换为 wchar_t * 4.textBrowser 显示乱码 追加 5.checkBox的使能)

今天写小程序遇到的问题,做个小总结: 1.如何对某一位置0或者置1? 写成宏,方便移植 #define setbit(x,y) x|=(1...

char* 与wchar_t*类型之间的转换(代码实测可行)

相信会有很多人从VC++6.0环境转移到VS2010后会遇到各种各样的问题,其中一个便是各种字符类型转换的问题,这在6.0下面很少遇到,遇到了强转即可,而在VS2010下面是不可行的。在我遇到这个问题...

宽字符wchar_t和窄字符char区别和相互转换

转自:http://blog.csdn.net/nodeathphoenix/article/details/7416725 1.    首先,说下窄字符char了,大家都很清楚,就是8bi...

C++中char*与wchar_t*之间的转换

代码编译运行环境:VC++2012+Debug+Win321.问题描述char字符与wchar_t字符由于编码不同,所以在char*和wchar_t*之间使用强制类型转换达不到正确转换字符串的目的。考...

宽字符wchar_t和窄字符char区别和相互转换

宽字符wchar_t和窄字符char区别和相互转换 1.    首先,说下窄字符char了,大家都很清楚,就是8bit表示的byte,长度固定。char字符只能表示ASII码表中的256个字...

VC++中通过MultiByteToWideChar将string|char*转换为wstring|wchar_t*

将string|char*转换为wstring|wchar_t*的例子: 1、string转换为wstring: string str=_T("翔翔糖糖"); int size=MultiByt...
  • wskelan
  • wskelan
  • 2012年03月26日 22:41
  • 1323
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:wchar_t与char转换
举报原因:
原因补充:

(最多只允许输入30个字)