wchar_t与char转换

原创 2007年10月10日 13:46:00

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

         wchar_t 转换为char 的代码如下:

         有如下的wchar_tchar变量

         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_tchar的转化,charwchar_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*之间的转换

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

转义字符 通用字符名 字符char wchar_t

C++转义序列 字符名称 ASCII符号 C++代码 ASCII码 换行符 NL(LF) \n 10 水平制表符 HT \t 9 垂直制表符 VT...
  • J_Crocodile
  • J_Crocodile
  • 2017年02月28日 14:15
  • 526

char*与wchar_t*之间的转换

谈C++中char*与wchar_t*之间的转换   2008-06-20 21:04:14|  分类: 技术创新 |  标签:c++  编程  电脑  |举报|字号 订阅 关于C++...
  • mjhmjhmjh123
  • mjhmjhmjh123
  • 2014年03月03日 23:02
  • 574

wchar_t与char转换(总结)

#include//标准C++; string   tp; wchar_t   *s; char   *d; tp=s; d=tp.c_str(); 也可使用WideCharTo...
  • lgh1992314
  • lgh1992314
  • 2013年06月03日 19:32
  • 2164

wchar与char字符转换的探究

本文主要通过实例测试了字符串和宽字符保存时的编码格式,以及对C标准的宽字符转换函数对于编码格式的转换进行了验证。...
  • skyhacer
  • skyhacer
  • 2014年11月02日 23:01
  • 1056

关于wchar_t 的输出及 wchar_t* 与 char*之间的相互转换

wchar_t 定义的变量之所以不能输出呢?我查了一下资料,就是说宽字符类型要本地化,否则输不出想要结果。 本地化有三条语句可以使用,任取其一。最后一句是全局函数,前两个是wcout的一个成员函数的...
  • liangzhao_jay
  • liangzhao_jay
  • 2013年04月23日 18:13
  • 2305

c++ 字符类型总结区别wchar_t,char,WCHAR

1.区别wchar_t,char,WCHAR    ANSI:即 char,可用字符串处理函数:strcat( ),strcpy( ), strlen( )等以str打头的函数。    UNI...
  • h_wlyfw
  • h_wlyfw
  • 2014年02月24日 09:38
  • 1477

C++大小写转换和性能

本文主要讨论最基本的一些大小写转换函数和API,不讨论一些常见的字符串程序库里面的大小写转换接口,另外本文的落脚点是这些转换函数的性能和日常开发中遇到的一些问题。...
  • magictong
  • magictong
  • 2015年03月30日 20:21
  • 7568

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

关于C++中的char*与wchar_t*这两种类型的相互转换,网上说的大多很繁琐,可行性也不高。下面这个方法是在MSDN里面找到的,个人认为还比较不错: 把char*转换为wchar_t* ...
  • qq1041256623
  • qq1041256623
  • 2013年12月13日 15:38
  • 428

VS2010 CString与char互相转换的方法

测试环境:WIN7 64位,VS2010的WIN32控制台下 包涵头文件 #include #include #include 工程属性设置为:   封装函数: 函数功能:将多字节字符...
  • PZ0605
  • PZ0605
  • 2017年02月25日 23:32
  • 1659
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:wchar_t与char转换
举报原因:
原因补充:

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