• 跨平台实现wchar_t转成char


    C++准中,wchar_t字符型,wchar_t型占2个字16字的表示就要用到wchar_t char,我都知道,占一个字8。其知道了个以后,要在wchar_t char种类型之间转换就不难实现了。

             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] = '';

        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 = '';
            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 ;

    }

     

  • 相关阅读:
    接口与实现分离
    C++的explicit关键字
    C++的类型转换
    使用catch做单元测试简介
    C++可调用对象与函数表
    在sublime中使用cppcheck
    你需要的代码静态检查
    构造析构与拷贝赋值那些事
    c++的关联容器入门(map and set)
    【致敬程序猿】
  • 原文地址:https://www.cnblogs.com/pangblog/p/3246873.html
Copyright © 2020-2023  润新知