mbstowcs_s实现wchar_t转成char
把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 <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的更多相关文章
- 跨平台实现wchar_t转成char
位宽.其实知道了这个以后,要在wchar_t 和 char两种类型之间转换就不难实现了. wchar_t 转换为char 的代码如下: 有如下的wchar_t和char变量 wchar_t w_cn ...
- CString转换成char*
CString转换成char* :charSource = (char*)strSource.GetBuffer(0); 法2:charSource = (char*)strSource.GetBuf ...
- 将string转换成char*
string 是c++标准库里面其中一个,封装了对字符串的操作 把string转换为char* 有3中方法: 1.data 如: string str="abc"; ch ...
- CString 转换成 char *
最近用到CString类,转换成 char * 类型,下面介绍用法: 一.CString 和 LPSTR 转换: CString转换成LPSTR: 方法一:CString server; LPSTR ...
- 将COleDateTime类型数据转换成char *数据
用OpenCV做多摄像头校准时间,在图像上显示时间信息,需求要将COleDateTime类型数据转换成char *数据 具体代码如下: 1: COleDateTime m_checkDate; 2: ...
- sprintf将CString转换成char[]
在MFC中使用sprintf()函数将CString转换成char[]时,char[]只接受第一个字符 使用的是VS2008 CString name;dbName="test" ...
- 将string转换成char型的一般方法
C++文件读取中: infile in: in.open("file.dat",ios::in); 这样是能够的. 可是 string a; a="file.dat&qu ...
- 个人觉得存成char(12),优于varchar(12)
w 延展一点:0----(还是上边的url),varchar(10)则数据库的存储1-11bytes,而不是0-10bytes;varchar(256)则为2-258bytes; 1----如果待入库 ...
- C++ 将string转换成char*字符串
我们经常会使用C和C++的混合编程,在某些情况下,需要将C++的string,转换成char* 的字符串.下面说两种可行的方法,作为总结. 1. data(); 如: string str=" ...
随机推荐
- ios实现类似魔兽小地图功能 在
写了一个类似魔兽小地图功能的控件. 比如你有一个可以放大缩小的scrollView.会在里面进行一些放大缩小,点击里面的按钮呀,等操作. 这个小地图控件.就会和你的大scrollView同步.并有缩略 ...
- hdu 3948(后缀数组+RMQ)
题意:求一个串中有多少不同的回文串. 分析:这一题的关键是如何去重,我表示我现在还没理解为什么这样去重,先放这里过两天再看!! //不同回文子串数目 #include <iostream> ...
- C# delegate 学习 (练这么久终于悟出来点东东了,继续加油! ^_^)
前言 从事开发工作两年有余了,但还是对Delegate,Event神马的看见就头疼,文章看过无数,自己也练习过好多遍,但到用的时候或者人家换了一种形式之后就又不懂了,哎~智商捉急啊!! 但是,这两天的 ...
- SDUT 3571 Password 暴力搜索
这个题如果裸搜肯定超时了 但是我们可以枚举,用初始串的哪一位数字去填目标串的那一位数字 这样就是暴力6!,复杂度很低,然后需要解决过程中经过的点的问题, 因为是从左向右走,所以记录当前光标, 和当前达 ...
- Java连接Oracle10g
1.导入驱动包: a.找到oracle安装目录下的jdbc/lib中的文件classes12.jar: b.右击你创建的JAVA工程,找到Build path,选择Add External Archi ...
- C# 中如何判断某个字符串是否为空的方法 分享了三个方法来判断字
1. 三种常用的字符串判空串方法:Length法:bool isEmpty = (str.Length == 0);Empty法:bool isEmpty = (str == String.Empty ...
- Python pycurl
常用方法: pycurl.Curl() #创建一个pycurl对象的方法 pycurl.Curl(pycurl.URL, http://www.google.com.hk) #设置要访问的URL py ...
- 高性能、高容错、基于内存的开源分布式存储系统Tachyon的简单介绍
Tachyon是什么? Tachyon是一个高性能.高容错.基于内存的开源分布式存储系统,并具有类Java的文件API.插件式的底层文件系统.兼容Hadoop MapReduce和Apache Spa ...
- Hadoop学习之--Capaycity Scheduler源码分析
Capacity Scheduler调度策略当一个新的job是否允许添加到队列中进行初始化,判断当前队列和用户是否已经达到了初始化数目的上限,下面就从代码层面详细介绍整个的判断逻辑.Capaycity ...
- 取消本地SVN文件夹与服务器关联
问题:之前建了一个SVN代码库,同步了代码上去,但中途发现建库时的规则搞错了,就把服务器上的库给删了重建,然后改变本地代码的svn服务器关联地址,但使用Relocate一直报错. 错误有两种情况:1. ...