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++ WINDOWS下 wchar_t *和char * 相互转化总结篇

说道wchar_t和char两个类型大家都不会陌生 wchar_t:在windows下是Unicode 16编码,也就是俗称宽字节 char:当然就是指一个字节,在windows下面默认是gbk编码的...
  • lightspear
  • lightspear
  • 2017-01-23 18:37:30
  • 7920

wchar_t和char,WCHAR和CHAR的区别和互相转化

win32应用程序的低层winnt.h头文件: #ifndef VOID #define VOID void typedef char CHAR; typedef short SHORT; ...
  • xukaiwen_2016
  • xukaiwen_2016
  • 2016-07-31 14:18:02
  • 7080

Linux 下char转换为wchar_t

LInux下使用mbstowcs函数可以将char转化为wchar_t 函数含义:convert a multibyte string to a wide char string 说明:       ...
  • caigen1988
  • caigen1988
  • 2014-02-11 13:52:27
  • 5880

Linux下 wchar_t 与char 转换

为了支持多语言,需要支持宽字符,Linux下用wchar_t表示,wchar_t最大长度4个字节,已经可以囊括世界上所有的语言编码,中文字符在gb2312编码下用2个字节表示,但用utf-8编码需要3...
  • wwlhz
  • wwlhz
  • 2017-07-07 19:37:49
  • 601

char与wchar_t互转

  • 2012年08月23日 14:35
  • 977B
  • 下载

wchar_t*和char*之间的互相转换的那些事

http://blog.csdn.net/hellward/article/details/5364927 最近在看一写PE文件格式的东西,想做一个读取PE文件信息的小工具,中间遇到将LPVOI...
  • lanshengsheng2012
  • lanshengsheng2012
  • 2014-05-29 17:45:41
  • 5884

wchar与char字符转换的探究

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

char wchar_t 之间的转换程序

  • 2011年02月24日 11:21
  • 1KB
  • 下载

编码问题:unicode与utf-8,wchar_t与char

unicode与utf-8 wchar_t
  • freestyle4568
  • freestyle4568
  • 2015-11-02 21:32:43
  • 1621

Unicode下wstring(wchar_t*)和string(char*)互相转换

#include using namespace std; //将string转换成wstring wstring string2wstring(st...
  • educast
  • educast
  • 2013-09-18 08:28:30
  • 1749
收藏助手
不良信息举报
您举报文章:wchar_t与char转换
举报原因:
原因补充:

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