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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436127.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle 12c sql图形化,Oracle 12c PL/SQL程序设计终极指南

Oracle 12c PL/SQL程序设计终极指南作者&#xff1a;孙风栋;王澜;郭晓惠出版日期&#xff1a;2015年06月文件大小&#xff1a;11.73M支持设备&#xff1a;&#xffe5;60.00在线试读适用客户端&#xff1a;言商书局iPad/iPhone客户端&#xff1a;下载 Android客户端&#xff1a…

CSS的语法结构

今天又看了一点书&#xff0c;哎我看书的速度可是够慢的。现摘录下来自己也增强下记忆&#xff0c;反正闲着也是闲着o(∩_∩)o...。 CSS的语法结构 CSS的语法结构由三个部分组成&#xff1a;选择符&#xff0c;(Selector)&#xff0c;属性(Porperty)和值(Value)。 使用方法…

WinCE 控制面板的创建

控制面板的组件,其实就是一个地地道道的DLL文件,所不同的是其后缀名为.CPL而已.控制面板组件对外必须要实现一个CPlApplet接口,其原型为:LONG CALLBACK CPlApplet(HWND hwndCPL,UINT message, LPARAM lParam1, LPARAM lParam2).而在此函数之中,为了使组件正常运作,我们必须要处…

oracle 存储同步,Oracle数据库知识——存储过程篇

在线QQ客服&#xff1a;1922638专业的SQL Server、MySQL数据库同步软件存储过程是一组用于完成特定功能的SQL语句&#xff0c;该语句已编译并存储在数据库中。用户通过指定存储过程的名称并提供参数(如果存储过程具有参数)来执行它。存储过程是数据库中的重要对象。任何设计良好…

【转】C++中的static_cast ,reinterpret_cast的用法和区别

转自&#xff1a;https://www.cnblogs.com/heyonggang/p/3361643.html 原文地址&#xff1a;https://www.cnblogs.com/heyonggang/p/3361643.html 用法&#xff1a;static_cast < type-id > ( expression ) 该运算符把expression转换为type-id类型&#xff0c;但没有运…

使用MvcContrib的FormHelper

MvcContrib的FormHelper提供了三大Helper Html辅助 验证HelperGrid表格Helper下载 下载后将MvcContrib.dll与MvcContrib.Samples.FormHelper.dll引用到Asp.net MVC工程 在Web.Config pages.namespaces加入以下节点 <add namespace"MvcContrib.UI.Tags"/><ad…

WinCE控制面板添加应用程序

WinCE系统中的控制面板和Windows系统中的控制面板原理是一样的&#xff0c;里面就是包含了一些应用程序。WinCE系统的控制面板由Ctlpnl.exe&#xff0c;Control.exe和一些.cpl文件组成&#xff0c;其中Ctlpnl.exe和Control.exe用于控制控制面板的文件夹显示和架构&#xff0c;而…

【转】滚动条消息(WM_VSCROLL和WM_HSCROLL)

转自&#xff1a;https://blog.csdn.net/zmq5411/article/details/6756189 &#xff08;1&#xff09;当用户单击滚动条或者是拖动滑块时&#xff0c;Windows会向窗口过程发送WM_VSCROLL消息&#xff08;垂直滚动时&#xff09;或者是WM_HSCROLL消息&#xff08;水平滚动时&am…

【转】CMMI环境下,该如何实施Agile?

“CMMI与敏捷之间是否有什么样的关系&#xff1f;是矛盾的&#xff1f;还是可融合的&#xff1f;”“在CMMI环境下如何实施敏捷&#xff1f;”自从“敏捷”诞生以后&#xff0c;此类话题就此起彼伏&#xff0c;从未停止。前几日&#xff0c;在AgileChina的讨论组中&#xff0c;…

透析WINCE的控制面板

WindowsCE是微软公司嵌入式、移动计算平台的基础&#xff0c;它是一个开放的、可升级的32位嵌入式操作系统&#xff0c;是基于掌上型电脑类的电子设备操作系统&#xff0c;它是精简的Windows 95,Windows CE的图形用户界面相当出色。Windows CE作业系统是Windows家族中最新的成员…

oracle 游标 904,如何解决Oracle数据库游标连接超出问题

如何解决Oracle数据库游标连接超出问题发布时间&#xff1a;2020-07-21 10:57:35来源&#xff1a;亿速云阅读&#xff1a;103作者&#xff1a;小猪这篇文章主要讲解了如何解决Oracle数据库游标连接超出问题&#xff0c;内容清晰明了&#xff0c;对此有兴趣的小伙伴可以学习一下…

【转】windows程序设计(14):鼠标消息详解

关于鼠标的一些细节知识&#xff1a; 通常&#xff0c;我们发消息时&#xff0c;都是对一个特定的窗口&#xff0c;但是对于鼠标消息却不然&#xff1a;只要鼠标跨越窗口或者在某窗口中按下鼠标按键&#xff0c;那么窗口消息处理程序就会收到鼠标消息&#xff0c;而不管该窗口…

用多媒体库 Bass.dll 播放 mp3 [15] - 设置与获取播放速度

本例效果图:代码文件:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ComCtrls;typeTForm1 class(TForm)OpenDialog1: TOpenDialog;Button1: TButton;Button2: TButton;Button3: TButton;TrackBar1:…

详解WINCE的控制面板

曾经在我的一篇《控制面板的创建》中介绍过WinCE控制面板的结构,不过由于那篇文章其目的只在于控制面板如何调用EXE程序,故对控制面板也仅是泛泛而谈.不过在这篇文章中,我们将对WinCE的使用方法来个整体的详解. 1.控制面板的结构 控制面板其实也是个动态链接库…

【转】设置Win32窗口背景颜色

窗口类结构体中&#xff0c;有一个窗口背景成员&#xff0c;hbrBackground。它是一个画刷句柄类型。在Windows中有各种各样的句柄&#xff0c;比如窗口句柄、实例句柄&#xff0c;画刷句柄&#xff0c;文件句柄等等&#xff0c;他们都是句柄类型&#xff0c;只是每一种句柄都和…

oracle中plsql块的结构,oracle plsql的结构

变量声明部分(没有变量可以不写declare)begin执行部分exception异常处理部分end*&#xff1a;declare 和 exception部分是可选的(1)PL/sql中变量的定义格式1变量名 变量类型 【约束】 default 默认值格式2变量名 变量类型 【约束】【&#xff1a;初始值】(2)一个简单的PL/sql块…

【转】Dicom文件解析!!!!!!

转自&#xff1a;https://blog.csdn.net/leaf6094189/article/details/8510325 Dicom全称是医学数字图像与通讯&#xff0c;这里讲的暂不涉及通讯那方面的问题 只讲*.dcm 也就是diocm格式文件的读取&#xff0c;读取本身是没啥难度的 无非就是字节码数据流处理。只不过确实比较…

VS2008 JS脚本调试总是调试旧代码 真不知道怎么回事?谁能帮帮我呀!

如图,[dynamic]标记的是调试的元文件 xml1.htm[dynamic]和xml.js[dynamic] 我更改后的文件是xml1.htm和xml.js,见图1 2 调试的文件有debugger 更改后的文件我把debugger注了 js脚本中我把变量给改了见3 4 ,所以在浏览新的xml1.htm时,竟然报对象找不到,真实受不了了!!! 为什么我…

蜂窝注册表和永久存储

WindowsCE有两种注册表&#xff0c;一种是基于RAM的&#xff0c;一种是基于蜂窝的注册表&#xff1b;WindowsCE会默认使用前者。如果是使用前者&#xff0c;PB在编译的时候会先把common.reg、platform.reg、project.reg及所有的.reg文件的内容合并到reginit.ini文件&#xff0c…

修改oracle默认日期,Oracle 修改默认日期格式

1、Oracle的日期格式Oracle数据缺省的时间格式数据的显示形式&#xff0c;与所使用的字符集有关。一般显示年月日&#xff0c;而不显示时分秒。例如&#xff0c;使用us7ascii字符集(或者是其他的英语字符集)时&#xff0c;缺省的时间格式显示为&#xff1a;28-Jan-2003&#xf…