WideCharToMultiByte与MultiByteToWideChar

来源:互联网 发布:modbus仿真软件 编辑:程序博客网 时间:2024/04/29 13:34

搞编程的程序员怎么可能不遇到关于编码的问题呢?在网页经常用到 :gb2312,UTF-8等等,在数据库上也会用到,还有还有很多多......无奈,今天又遇到了一个编码的问题,就是在MFC中的WideCharToMultiByte与MultiByteToWideChar这两个编码转换函数,看了一上午的东西,终于在看了

荷包蛋:http://www.cnblogs.com/gakusei/articles/1585211.html

这篇文章之后,才算有所理解。

函数原型:

int MultiByteToWideChar(  _In_       UINT CodePage,  _In_       DWORD dwFlags,  _In_       LPCSTR lpMultiByteStr,  _In_       int cbMultiByte,  _Out_opt_  LPWSTR lpWideCharStr,  _In_       int cchWideChar);

int WideCharToMultiByte(  _In_       UINT CodePage,  _In_       DWORD dwFlags,  _In_       LPCWSTR lpWideCharStr,  _In_       int cchWideChar,  _Out_opt_  LPSTR lpMultiByteStr,  _In_       int cbMultiByte,  _In_opt_   LPCSTR lpDefaultChar,  _Out_opt_  LPBOOL lpUsedDefaultChar);

主要是对于第一个参数,也就是代码页不了解。不知道究竟什么时候用什么参数?到底这个参数指的是:源数据的格式,还是转换之后的格式?看了好些函数的实际应用都感觉不是那么回事。于是我接着找啊找啊。终于看到下面一句话,才知道自己似乎明白了一些东西:

WideCharToMultiByte的代码页用来标记与新转换的字符串相关的代码页。
MultiByteToWideChar的代码页用来标记与一个多字节字符串相关的代码页。
常用的代码页由CP_ACP和CP_UTF8两个。
使用CP_ACP代码页就实现了ANSI与Unicode之间的转换。
使用CP_UTF8代码页就实现了UTF-8与Unicode之间的转换。

原来widechar指的是Unicode,这个是一个标准。mutilchar指的是CP_ACP(ansi),CP_UTF8(utf-8)。这些编码要么转换到unicode,要么从unicode转换到这些编码。所以第一个CodePage指的就是被转换成unicode的字符的编码(MultiByteToWideChar)或者unicode要转换的编码(WideCharToMultiByte)。


ps:Unicode与utf-8的区别

UTF是 Unicode Translation Format,即把Unicode转做某种格式的意思。 在Unicode基本多文种平面定义的字符(无论是拉丁字母、汉字或其他文字或符号),一律使用2字节储存。而在辅助平面定义的字符,会以代理对(surrogate pair)的形式,以两个2字节的值来储存。
unicode是一种编码方式,和ascii是同一个概念,而UTF是一种存储方式(格式)。 
在jvm内部,虚拟机管理数据(内存里)时,或者在进行对象序列化的时候,字符(串)都是以unicode编码方式的。
但是在jvm中,字符(串)是以char 这种(存储)形式存放的,一个char占2个字节(例如可以定义char c='字'),就是“字”和“Z”是同样占2个字节的;而在对象序列化后,对象是进行UTF-8存储的,一个中文占2个字节,而英文、数字等只占一个字节,可以参看下面的链接。 
所以导致系列化以后的对象只占平时的大约一半的空间(当全是中文时占用相同的空间;全是英文时unicode占用的空间是UTF-8的2倍)。 
UTF-16比起UTF-8,好处在于大部分字符都以固定长度的字节 (2字节) 储存,但UTF-16却无法兼容于ASCII编码。

程序运行时用哪种CodePage解释我们的字符串呢?

在运行   Microsoftindows®操作系统的计算机上,操作系统和Windows 应用程序使用的代码页由Windows区域设置定义。区域设置是在安装操作系统时选择的。Windows   应用程序使用由Windows区域设置定义的代码页来解释数据。Windows   应用程序还支持宽字符数据,即Unicode 数据。

原创粉丝点击