位宽。其实知道了这个以后,要在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 ;

}

位的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 ;

}

跨平台实现wchar_t转成char的更多相关文章

  1. mbstowcs_s实现wchar_t转成char

    把char*转换为wchar_t* 用stdlib.h中的mbstowcs_s函数,可以通过下面的例子了解其用法: char*CStr = "string to convert"; ...

  2. CString转换成char*

    CString转换成char* :charSource = (char*)strSource.GetBuffer(0); 法2:charSource = (char*)strSource.GetBuf ...

  3. 将string转换成char*

    string 是c++标准库里面其中一个,封装了对字符串的操作  把string转换为char* 有3中方法:  1.data  如:  string str="abc";  ch ...

  4. CString 转换成 char *

    最近用到CString类,转换成 char * 类型,下面介绍用法: 一.CString 和 LPSTR 转换: CString转换成LPSTR: 方法一:CString server; LPSTR ...

  5. 将COleDateTime类型数据转换成char *数据

    用OpenCV做多摄像头校准时间,在图像上显示时间信息,需求要将COleDateTime类型数据转换成char *数据 具体代码如下: 1: COleDateTime m_checkDate; 2: ...

  6. sprintf将CString转换成char[]

      在MFC中使用sprintf()函数将CString转换成char[]时,char[]只接受第一个字符 使用的是VS2008 CString name;dbName="test" ...

  7. 将string转换成char型的一般方法

    C++文件读取中: infile in: in.open("file.dat",ios::in); 这样是能够的. 可是 string a; a="file.dat&qu ...

  8. 个人觉得存成char(12),优于varchar(12)

    w 延展一点:0----(还是上边的url),varchar(10)则数据库的存储1-11bytes,而不是0-10bytes;varchar(256)则为2-258bytes; 1----如果待入库 ...

  9. C++ 将string转换成char*字符串

    我们经常会使用C和C++的混合编程,在某些情况下,需要将C++的string,转换成char* 的字符串.下面说两种可行的方法,作为总结. 1. data(); 如: string str=" ...

随机推荐

  1. .NET面试题系列

    索引: .NET框架基础知识[1] - http://www.cnblogs.com/haoyifei/p/5643689.html .NET框架基础知识[2] - http://www.cnblog ...

  2. WebForm+Web.config: 超时时间已到。在操作完成之前超时时间已过或服务器未响应。

    ylbtech-Error-WebForm+Web.config: 超时时间已到.在操作完成之前超时时间已过或服务器未响应. 超时时间已到.在操作完成之前超时时间已过或服务器未响应. 1.A,错误代码 ...

  3. Shell获取Aix/linux/unix机器上db2和os的信息并上传到指定服务器

    (之前写过一篇类似的文章,当时传输文件用的是ftp,因为项目觉得ftp不够安全所以这次换成了scp,同时对脚本的一些地方也做了一些调整) 其实做这个东西还是因为项目的需求,需要获取某些机器(目前主要是 ...

  4. android sensor传感器系统架构初探

    http://blog.csdn.net/qianjin0703/article/details/5942579 http://blog.chinaunix.net/uid-28621021-id-3 ...

  5. .NET中获取字符串的MD5码

    C# 代码: 导入命名空间(需要在Web页面的代码页中引用) using System.Web.Security; 获取MD5码 string Password = FormsAuthenticati ...

  6. xmpp 协议之可扩展消息(messaging)与状态(presence)协议核心: RFC 3920

    附:asmack已经不需要了,4.1以后的smack已经可以在android上使用了. XMPP Clients:   http://xmpp.org/software/clients.html An ...

  7. cmake编译win下64位obs

    obs是一款开源编码推流工具,简单易用,非常流行.一次项目中,发现本台式机I3处理器下32位obs推流CPU使用率100%.而使用的第三方设备在64位下,性能较好.所以需要编译64位obs并且编译相应 ...

  8. Apache Spark GraphX的使用简介

    类似 Spark 在 RDD 上提供了一组基本操作符(如 map, f ilter, reduce), GraphX 同样也有针对 Graph 的基本操作符,用户可以在这些操作符传入自定义函数和通过修 ...

  9. Linux后台运行程序

    Linux后台运行程序 最近写的程序需要部署到Linux服务器上,按照以前的方式,在运行后面增加&,程序会切换为后台运行.但因为Linux一般是通过ssh远程登录的,等到退出当前session ...

  10. Hibernate3注解

    1.@Entity(name="EntityName") 必须,name为可选,对应数据库中一的个表 2.@Table(name="",catalog=&quo ...