把char*转换为wchar_t*

用stdlib.h中的mbstowcs_s函数,可以通过下面的例子了解其用法:

char*CStr = "string to convert";

size_t len = strlen(CStr) + 1;

size_t converted = 0;

wchar_t*WStr;

WStr=(wchar_t*)malloc(len*sizeof(wchar_t));

mbstowcs_s(&converted, WStr, len, CStr, _TRUNCATE);

其结果是WStr中储存了CStr的wchar_t版本。

把wchar_t*转换为char*

和上面的方法类似,用stdlib.h中的wcstombs_s函数,例子:

wchar_t*WStr = L"string to convert";

size_t len = wcslen(WStr) + 1;

size_t converted = 0;

char*CStr;

CStr=(char*)malloc(len*sizeof(char));

wcstombs_s(&converted, CStr, len, WStr, _TRUNCATE);

这时WStr中的内容将被转化为char版本储存在CStr中。

另外还可以通过流的方法来char*类型转换为wchar_t*类型,但这样的转换得到的结果将是const类型,而类似的方法不能将wchar_t*类型转换为char*类型。

把(const)char*转换为const wchar_t*

需要用到sstream 头文件:

char*cstr="string to convert";

wstringstream wss;

wss<<cstr;

再调用wss.str().c_str(); 即可得到const wchar_t* 类型的返回值。

虽然stringstream流不能将wchar_t*转换成char*,但可以用来进行数值类型和字符串之间的转换,例如:

doubled=2734792.934f;

stringstream ss;

ss<<d;

调用ss.str()可得到string类型字符串”273479e+006”,又如:

string str("299792458");

stringstream ss;

longi=0;

ss<<str;

ss>>i;

此时i=299792458。

char 转wchar_t 及wchar_t转char

利用widechartomultibyte来转换的函数

通常适合于window平台上使用

#include <tchar.h>

#include <windows.h>

int _tmain(
int argc, _tchar* argv[])

{

wchar_t pwstr[] =l"我是中国人";

wchar_t pwstr2[20];

char *pcstr = (
char *)malloc(
sizeof(
char)*(2 * wcslen(pwstr)+1));

memset(pcstr , 0 , 2 * wcslen(pwstr)+1 );

w2c(pcstr,pwstr,2 * wcslen(pwstr)+1) ;

printf("%s\n",pcstr);

c2w(pwstr2,20,pcstr);

wprintf(l"%s",pwstr2);

free(pcstr) ;

return 0;

}

//
将wchar_t* 转成char*的实现函数如下:

char *w2c(
char *pcstr,
const wchar_t *pwstr, size_t len)

{

int nlength=wcslen(pwstr);

//
获取转换后的长度

int nbytes = WideCharToMultiByte( 0, 
//
 specify the code page used to perform the conversion

0,         
//
 no special flags to handle unmapped characters

pwstr,     
//
 wide character string to convert

nlength,   
//
 the number of wide characters in that string

NULL,      
//
 no output buffer given, we just want to know how long it needs to be

0,

NULL,      
//
 no replacement character given

NULL );    
//
 we don't want to know if a character didn't make it through the translation

//
 make sure the buffer is big enough for this, making it larger if necessary

if(nbytes>len)   nbytes=len;

//
 通过以上得到的结果,转换unicode 字符为ascii 字符

WideCharToMultiByte( 0, 
//
 specify the code page used to perform the conversion

0,         
//
 no special flags to handle unmapped characters

pwstr,   
//
 wide character string to convert

nlength,   
//
 the number of wide characters in that string

pcstr, 
//
 put the output ascii characters at the end of the buffer

nbytes,                           
//
 there is at least this much space there

NULL,      
//
 no replacement character given

NULL );

return pcstr ;

}

//
将char* 转成wchar_t*的实现函数如下:

//
这是把asii字符转换为unicode字符,和上面相同的原理

void c2w(wchar_t *pwstr,size_t len,
const 
char *str)

{

if(str)

{

size_t nu = strlen(str);

size_t n =(size_t)multibytetowidechar(cp_acp,0,(
const 
char *)str,(
int)nu,
null,0);

if(n>=len)n=len-1;

multibytetowidechar(cp_acp,0,(
const 
char *)str,(
int)nu,pwstr,(
int)n);

pwstr[n]=0;

}

}

或者用此种方法更好一些:============我自已做的

//
把ascii 字符转换为unicode字符

wchar_t* Cphone_hq::ctow(wchar_t *pwstr, 
const 
char *str)

{

wchar_t* buffer;

if(str)

{

size_t nu = strlen(str);

size_t n =(size_t)MultiByteToWideChar(CP_ACP,0,(
const 
char *)str,
int(nu),NULL,0);

buffer=0;

buffer = 
new wchar_t[n+1];

//
if(n>=len) n=len-1;

::MultiByteToWideChar(CP_ACP,0,(
const 
char *)str,
int(nu),buffer,
int(n));

}

return buffer;

delete buffer;

}

相关知识点:

Unicode的出现是为了适应软件国际化的需要。Unicode不同于双字节字符集(DBCS)。

一、相关操作函数

1、DBCS使用下面的函数操作字符串:

CharNext——获得后一个字符

CharPrev——获得前一个字符

IsDBCSLeadByte——判断是否为两个字节字符的第一个字节

C++运行期库提供了以"_mbs"开头的一系列的函数操作DBCS。类似的函数有_mbscat等。

2、ANSI字符集是一个美国标准。C++运行期库提供了以"str"开头的一些列的函数操作此字符集。

3、C++运行期库为Unicode字符集提供了一系列以"wcs"开头的函数。

二、对应的数据类型

1、对于ANSI字符定义为char。

2、对于Unicode的字符定义为wchar_t。

三、使用环境

1、首先要说明的是Win98对于Unicode的支持是很微弱的,所以如果要在Win98上运行Unicode编译的程序,可能造成运行错误或者失败。

2、 由于Win2000及以后的OS的内核都是使用Unicode编写的,所以虽然可以在其上运行ANSI编码的程序,但是其运行过程中很多地方都需要将 ANSI转换为Unicode以后,调用Unicode版本的函数,因为这个转换的过程存在所以ANSI的程序运行效率不高。在Win2000上最好使用 Unicode编写程序。

四、编写通用的程序

1、在编程的时候使用TCHAR数据类型,此类型能够根据预编译宏的定义,将其转换为ANSI或者是Unicode。

2、预编译宏_MBCS、_UNICODE和UNICODE。_MBCS是多字节和ANSI字符串的编译宏。此时TCHAR将转换为char。_UNICODE和UNICODE是Unicode编码的预编译宏,TCHAR将转换为wchar_t。

3、_UNICODE和UNICODE与_MBCS不能在编译的时候同时被定义。

4、_UNICODE宏用于C运行期库的头文件,UNICODE宏用于Windows头文件。一般同时定义这两个宏。

五、转换函数

1、Unicode转换为ANSI使用:MultiByteToWideChar。

2、ANSI转换为Unicode使用:WideCharToMultiByte。

宽字符转多字符:

size_t wcstombs(char *mbstr, const wchar_t *wcstr, size_t count );

多字符转宽字符:

size_t mbstowcs(wchar_t *wcstr, const char *mbstr, size_t count );

另:L"ab"是C/C++标准宏,使用上是没有问题的

1、client 里有些函数接口需要unicode,这些由于资源也在本地,可以直接使用MultiByteToWideChar或者mbstowcs+setlocale 转换

2、对于需要从 中文client->服务器->韩文client的方式下,在传文本的情况下,需要将文字的语言代码一起传出去,在接受端可以使用指定的代 码,转换。服务器如有必要的话,也可以使用该代码转换,这样就可以在client上同时显示多国语言了

mbstowcs_s实现wchar_t转成char的更多相关文章

  1. 跨平台实现wchar_t转成char

    位宽.其实知道了这个以后,要在wchar_t 和 char两种类型之间转换就不难实现了. wchar_t 转换为char 的代码如下: 有如下的wchar_t和char变量 wchar_t w_cn ...

  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. 最简单的基于FFMPEG的转码程序

    本文介绍一个简单的基于FFmpeg的转码器.它可以将一种视频格式(包括封转格式和编码格式)转换为另一种视频格式.转码器在视音频编解码处理的程序中,属于一个比较复杂的东西.因为它结合了视频的解码和编码. ...

  2. css3属性及事例

    在看网上别的前端大牛的作品时,总会有新的收获,我想很多人应该都知道box-shadow,但是不知道有没有接触过这个 box-shadow: 2px 2px 4px rgba(0,0,0,0.4)  , ...

  3. JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码

    本文是<JVM 性能调优实战之:一次系统性能瓶颈的寻找过程> 的后续篇,该篇介绍了如何使用 JDK 自身提供的工具进行 JVM 调优将 TPS 由 2.5 提升到 20 (提升了 7 倍) ...

  4. 个人经验 - Android的RelativeLayout布局的layout_height属性设置为wrap_content时的坑

    Android的RelativeLayout布局的layout_height属性设置为wrap_content时的坑: 此坑出现的条件: 1.RelativeLayout布局的layout_heigh ...

  5. 修改Eclipse的EasyExplore插件的键盘快捷键

    工欲善其事,必先利其器 为了高效的编码,一个顺手的IDE是必不可少的. Eclipse下的EasyExplore插件挺不错,经常会打开项目的文件夹查找内容,只是日渐习惯全部键盘操作后,有时想使用Eas ...

  6. C++实现网格水印之调试笔记(一)

    首先说一下我的一些简单的调试方法,除了常规的断点调试之外,我还会使用注释的方法来调试.当整个工程代码量相当多且调用层次关系较为复杂时,这种方法能够比较高效的定位到出错误的代码段或某个函数,然后在出现错 ...

  7. jq实现图片轮播:圆形焦点+左右控制+自动轮播

    来源:http://www.ido321.com/862.html html代码: 1: <!DOCTYPE html> 2: <html lang="en"&g ...

  8. 网站繁简切换的JS遇到的一个BUG

    公司打算进入台湾市场,最近开发了繁体版本的网站,数据库里的信息全是简体,除了网页上固定的文字手动翻译了,文章内容标题都不是繁体. 于是在网上找了一段比较流行的繁简切换的JS实现了,不过后来却发现,有些 ...

  9. commons-lang3-3.4.jar

    StringUtils 1.StringUtils.isBlank(str); 检查字符串是否为空白(“ ”),为空(“”),为null. * StringUtils.isBlank(null)    ...

  10. HDU ACM 1496 Equations

    Equations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...