利用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上同时显示多国语言了

char 转wchar_t 及wchar_t转char相关推荐

  1. c语言char转wchar t,c语言char和wchar_t 转换

    最近遇到一个在C语言当中处理中文的问题,因为汉字和ascii不同,汉字是多字节编码方式,ascii只用一个字节表示,所以在用c语言提供的strlen函数得到的长度是字节长度; 以下都是utf-8编码方 ...

  2. [error] MFC错误不能将参数1从const char [3]转换为const wchar_t *

    在做项目中经常遇到很多错误,这里我仅仅把自己遇到的一些错误和解决方法写出,供自己和大家查看. 代码如下: CRect rect; GetClientRect(&rect); CString s ...

  3. C++中 出现C2664错误代码 从“const char [29]”转换为“const wchar_t *”

    报错内容: 报错无法 从"const char [29]"转换为"const wchar_t *" 解决办法 在属性页面将字符集修改为:使用多字节字符集就可以了 ...

  4. char qt 转unicode_Qt QString 中文 char* UTF-8 QByteArray QTextCodec unicode gb2312 GBK 乱码与转码问题...

    2012-03-22 14:00 175人阅读 评论(0) 代码如下:如果不不设全局的字符集是utf-8,那么网上一般的方法是可以转的.如下程序中 #define DD 1的情况下:但是如果设置了全局 ...

  5. mysql int char连接_MySQL中int、char以及varchar的性能比较

    软件安装:装机软件必备包 SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言.在使用它时,只需要发出& ...

  6. c语言中 char怎样用,C语言中char*和char[]用法区别分析

    C语言中char*和char[]用法区别分析 本文实例分析了C语言中char* 和 char []的区别.分享给大家供大家参考之用.具体分析如下: 一般来说,很多人会觉得这两个定义效果一样,其实差别很 ...

  7. C++ 宽字符(wchar_t)与窄字符(char)的转换

    了解 长度 宽字符wchar_t的长度16位,可以用来显示中文等除英文外的其他文字, 窄字符    char   的长度  8 位,只能处理英文. 哪里可以见到 在VS2010, 2012, 2013 ...

  8. JAVA中char占用多少字节_Java中char占用几个字节

    https://www.cnblogs.com/louiswong/p/6062417.html https://www.cnblogs.com/fnlingnzb-learner/p/7272348 ...

  9. c语言char数字转int补位,关于char强制转换成int到底是用0还是用1补位的猜想与检验...

    关于char强制转换成int到底是用0还是用1补位的猜想与检验 最近学C语言发现char强制转换时值会完全不同,而且变化很大,于是决定写代码测试一下. 先检验一下char型的-3和3在内存中分别怎么表 ...

最新文章

  1. gitee查看当前账号_upic+gitee图床,自由书写Markdown
  2. 力邀安卓为鸿蒙效力,期末阅读题答题秘籍2
  3. java程序员求职计划_2017年java程序员面试经验(500字)
  4. python毕业设计开题报告-基于Python的教学互动系统的设计与实现开题报告
  5. python下载教程1001python下载教程-请教vs2017下怎么使用python
  6. 老鼠之Atlas之旅(一):Atlas官方站点
  7. java内存分析_java内存分析总结
  8. 曲线的生成算法实现_PCGPlanet1-地形生成算法简介
  9. React开发(237):dva概念2state
  10. 前端学习(3018):vue+element今日头条管理--反馈
  11. 信息学奥赛一本通 1105:数组逆序重存放 | OpenJudge NOI 1.6 04
  12. api工具 graphql_使用GraphQL构建更好的可发现的API
  13. 如何从JFrog Artifactory下载资源到本地
  14. python word库_Python|利用第三方库编辑word的基本操作
  15. BP神经网络算法基本原理,bp神经网络算法详解
  16. 项目Kick Off 我们应该做什么?
  17. nginx代理邮件服务
  18. PLM产品生命周期管理,包含哪些阶段?
  19. jQWidgets Crack 用于响应式 Web 开发
  20. 中亦安图oracle培训,【中亦安图】Systemstate Dump分析经典案例(8)

热门文章

  1. 计算机软件总体上分为,山大2017春季班期末考试 信息系统B
  2. 13 | 线性排序:如何根据年龄给100万用户数据排序?
  3. Linux给Java程序设置端口_扫描服务端口的Java程序
  4. 太阳光是平行光吗_“彩虹的形成是因为光的色散和光沿直线传播是一回事吗?”...
  5. 六、Analysis of quicksort
  6. (五)ElasticSearch 6.1.1数据类型
  7. 【OS学习笔记】十 实模式:实现一个程序加载器-程序加载器如何将用户程序加载到内存并执行
  8. 【C++深度剖析教程10】C++中的字符串类
  9. python 实现统计ftp服务器指定目录下文件夹数目、文件数目及所有文件大小 本次主要为满足应用方核对上传到ftp服务器的文件是否缺漏。 主要要求:指定目录下,文件夹数目/文件数目/所有文件大小
  10. grafana授权公司内部邮箱登录 ldap配置