博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于多字节、宽字节、WideCharToMultiByte和MultiByteToWideChar函数的详解
阅读量:5871 次
发布时间:2019-06-19

本文共 2321 字,大约阅读时间需要 7 分钟。

 

所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码.

而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE.

********************************
第一个就是宽字符到多字节字符转换函数,函数原型如下:

int WideCharToMultiByte(
UINT CodePage,
DWORD dwFlags,
LPCWSTR lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cbMultiByte,
LPCSTR lpDefaultChar,
LPBOOL lpUsedDefaultChar
);
第一个参数:
CodePage: 指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,你也可以使用如下所示代码页之一。
CP_ACP 当前系统ANSI代码页(即多字节),在第二个函数里是宽字节,或者用0表示
CP_MACCP 当前系统Macintosh代码页
CP_OEMCP 当前系统OEM代码页,一种原始设备制造商硬件扫描码
CP_SYMBOL Symbol代码页,用于Windows 2000及以后版本,我不明白是什么
CP_THREAD_ACP 当前线程ANSI代码页,用于Windows 2000及以后版本,我不明白是什么
CP_UTF7 UTF-7,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL
CP_UTF8 UTF-8,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL

第二个参数:

dwFlags: 指定如何处理没有转换的字符, 但不设此参数函数会运行的更快一些,我都是把它设为0。 可设的值如下表所示:
WC_NO_BEST_FIT_CHARS 把不能直接转换成相应多字节字符的Unicode字符转换成lpDefaultChar指定的默认字符。也就是说,如果把Unicode转换成多字节字符,然后再转换回来,你并不一定得到相同的Unicode字符,因为这期间可能使用了默认字符。此选项可以单独使用,也可以和其他选项一起使用。
WC_COMPOSITECHECK 把合成字符转换成预制的字符。它可以与后三个选项中的任何一个组合使用,如果没有与他们中的任何一个组合,则与选项WC_SEPCHARS相同。
WC_ERR_INVALID_CHARS 此选项会致使函数遇到无效字符时失败返回,并且GetLastError会返回错误码ERROR_NO_UNICODE_TRANSLATION。否则函数会自动丢弃非法字符。此选项只能用于UTF8。
WC_DISCARDNS 转换时丢弃不占空间的字符,与WC_COMPOSITECHECK一起使用
WC_SEPCHARS 转换时产生单独的字符,此是默认转换选项,与WC_COMPOSITECHECK一起使用
WC_DEFAULTCHAR 转换时使用默认字符代替例外的字符,(最常见的如’?’),与WC_COMPOSITECHECK一起使用。

第三个参数:

lpWideCharStr: 待转换的宽字符串。

第四个参数:

cchWideChar: 待转换宽字符串的长度,-1表示转换到字符串结尾。

第五个参数:

lpMultiByteStr: 接收转换后输出新串的缓冲区。

第六个参数:

cbMultiByte: 输出缓冲区大小,如果为0,lpMultiByteStr将被忽略,函数将返回所需缓冲区大小而不使用lpMultiByteStr。

第七个参数:

lpDefaultChar: 指向字符的指针, 在指定编码里找不到相应字符时使用此字符作为默认字符代替。 如果为NULL则使用系统默认字符。对于要求此参数为NULL的dwFlags而使用此参数,函数将失败返回并设置错误码ERROR_INVALID_PARAMETER。

第八个参数:

lpUsedDefaultChar:开关变量的指针,用以表明是否使用过默认字符。对于要求此参数为NULL的dwFlags而使用此参数,函数将失败返回并设置错误码ERROR_INVALID_PARAMETER。lpDefaultChar和lpUsedDefaultChar都设为NULL,函数会更快一些。
返回值: 如果函数成功,且cbMultiByte非0,返回写入lpMultiByteStr的字节数(包括字符串结尾的null);cbMultiByte为0,则返回转换所需
字节数。函数失败,返回0。

*****************************************************

第二个是多字节字符到宽字符转换函数,函数原型如下:

int MultiByteToWideChar(

UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
int cbMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar
);

此函数把多字节字符串转换成宽字符串(Unicode),待转换的字符串并不一定是多字节的。

此函数的参数,返回值及注意事项参见上面函数WideCharToMultiByte的说明解释。

如果您认为这篇文章还不错或者有所收获,您可以通过扫描一下下面的支付宝二维码 打赏我一杯咖啡【物质支持】,也可以点击右下角的【推荐】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力

img_12e3f54d4d0f70f0eb14f20548e3d781.png

转载地址:http://quanx.baihongyu.com/

你可能感兴趣的文章
Spring Cloud 架构 五大神兽的功能
查看>>
Elicpse使用技巧-打开选中文件文件夹或者包的当前目录
查看>>
(代码篇)从基础文件IO说起虚拟内存,内存文件映射,零拷贝
查看>>
CentOS安装mariadb做为mysql的替代品
查看>>
路由事件
查看>>
NSRegularExpression iOS自带的正则表达式
查看>>
MyBatis逆向工程:根据table生成Model、Mapper、Mapper.xml
查看>>
Python 单例模式
查看>>
证书(3)如何在程序中使用数字证书
查看>>
Windows XP解决显示桌面图标消失的问题
查看>>
[设计模式] javascript 之 策略模式
查看>>
计算机能够这样玩—自我学习,自我思维,自我工作(编程)
查看>>
TBitConverter
查看>>
Android中监听ScrollView滑动停止和滑动到底部
查看>>
[Python]爬虫v0.1
查看>>
char*,const char*和string的相互转换
查看>>
VC++绘图时,利用双缓冲解决屏幕闪烁 转载
查看>>
android 33 对话框控件
查看>>
apache点NET环境
查看>>
jquery仿搜狐投票动画代码
查看>>