MultiByteToWideChar的与WideCharToMultiByte的参数详解
来源:互联网 发布:贝伦赛丽40周年 知乎 编辑:程序博客网 时间:2024/05/16 10:18
int
WideCharToMultiByte(
__in
UINT
CodePage,
// 标志了要与新转换的字符串关联的代码页
__in
DWORD
dwFlags,
// 制定额外的转换控制,一般不需要进行这种程度的控制,而为 dwFlag 传入 0
__in
LPCWSTR
lpWideCharStr,
// 指定要转换的字符串的内存地址
__in
int
cchWideChar,
// 指出该字符串的长度,如果传入 -1 ,则由函数来判断字符串的长度
__out
LPSTR
lpMultiByteStr,
// 转换后的缓冲区
__in
int
cbMultiByte,
// 指定 lpMultiByteStr 缓冲区的最大大小(字节数),如果传入 0 ,函数返回该目标缓冲区需要的大小
__in
LPCSTR
lpDefaultChar,
__out
LPBOOL
lpUsedDefaultChar
// 宽字符字符串中,如果至少有一个字符不能转换为对应的多字节形式,函数就会把这个变量设为 TRUE 。如果所有字符都能成功转换,就会把这个变量设为 FALSE。 通常将此函数传入 NULL 值。
);
只有一个字符在 uCodePage 制定的代码页中没有对应的表示时,WideCharToMultiByte 才会使用后两个参数。在遇到一个不能转换的字符时,函数便使用 pDefaultChar 参数指向的字符。如果这个参数指向为 NULL ,函数就会使用一个默认的字符。这个默认的值通常是一个问号。这对文件操作是非常危险的,因为问号是一个通配符。
此函数把宽字符串转换成指定的新的字符串,如ANSI,UTF8等,新字符串不必是多字节字符集。参数
CodePage: 指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,你也可以使用如下所示代码页之一。
CP_ACP 当前系统ANSI代码页
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
例子:
wchar_t* pwszUnicode = "Holle, word! 你好。 ";
int iSize;
char* pszMultiByte;
iSize = WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, NULL, 0, NULL, NULL);
pszMultiByte = (char*)malloc((iSize+1));
WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, pszMultiByte, iSize, NULL, NULL);
int
MultiByteToWideChar(
__in
UINT
CodePage,
// 标识了与多字节关联的一个代码页值
__in
DWORD
dwFlags,
// 允许我们进行额外的控制,它会影响带变音符号(比如重音)的字符。但是一般情况下不适用,赋为 0 即可。
__in
LPCSTR
lpMultiByteStr,
// 参数指定要转换的字符串
__in
int
cbMultiByte,
// 指定要转换串长度的长度(字节数),如果参数值是-1,函数便可自动判断源字符串的长度
__out
LPWSTR
lpWideCharStr,
// 指定转换后Unicode版本的字符串内存地址
__in
int
cchWideChar
// 指定 lpWideCharStr 缓冲区的最大长度。
// 如果传入0,函数不会进行转换,而是返回一个宽字符数(包括终止字符'\0'),
// 只有当缓冲区能够容纳该数量的宽字符时,转换才会成功。
);
此函数把多字节字符串转换成宽字符串(Unicode),待转换的字符串并不一定是多字节的。
dwFlags: 指定是否转换成预制字符或合成的宽字符,对控制字符是否使用像形文字,以及怎样处理无效字符。
MB_PRECOMPOSED 总是使用预制字符,即有单个预制字符时,就不会使用分解的基字符和不占空间字符。此为函数的默认选项,不能和MB_COMPOSITE合用
MB_COMPOSITE 总是使用分解字符,即总是使用基字符+不占空间字符的方式
MB_ERR_INVALID_CHARS 设置此选项,函数遇到非法字符就失败并返回错误码ERROR_NO_UNICODE_TRANSLATION,否则丢弃非法字符
MB_USEGLYPHCHARS 使用像形字符代替控制字符
转换步骤:
(1)调用 MultiByteToWideChar,为 pWideCharStr 参数传入 NULL, 为cchWideChar 参数传入 0,为 cbMultiByte 参数传入 -1 。
(2)分配一块足以容纳转换后的 Unicode 字符串的内容。它的大小是上一个 MultiByteToWideChar 调用的返回值乘以 sizeof(wchar_t) 。
(3)再次调用MultiByteToWideChar,这一次将缓冲区地址作为 pWideCharStr 参数的值传入,将第一次 MultiByteToWideChar 调用的返回值乘以 sizeof(wchar_t) 后得到大小作为 cchWideChar 参数的值传入。
(4)使用转换后的字符串
(5)释放 Unicode 字符串占用的内存块。
- MultiByteToWideChar的与WideCharToMultiByte的参数详解
- MultiByteToWideChar的与WideCharToMultiByte的参数详解
- MultiByteToWideChar的与WideCharToMultiByte的参数详解
- MultiByteToWideChar的与WideCharToMultiByte的参数详解
- MultiByteToWideChar的与WideCharToMultiByte的参数详解
- MultiByteToWideChar的与WideCharToMultiByte的参数详解
- MultiByteToWideChar的与WideCharToMultiByte的参数详解
- MultiByteToWideChar的与WideCharToMultiByte的参数详解
- MultiByteToWideChar的与WideCharToMultiByte的参数详解(转)
- MultiByteToWideChar与WideCharToMultiByte的使用
- MultiByteToWideChar和WideCharToMultiByte的正确使用方法及参数详解
- MultiByteToWideChar 和 WideCharToMultiByte 中第1个参数的理解
- MultiByteToWideChar 和WideCharToMultiByte的使用
- MultiByteToWideChar和WideCharToMultiByte的用法
- Windows核心编程:MultiByteToWideChar 与 WideCharToMultiByte 的正确用法
- MultiByteToWideChar和WideCharToMultiByte的正确使用方法及参数详解,实现字符编码转换、宽字符和字符的转换
- WideCharToMultiByte 和 MultiByteToWideChar 详解
- WideCharToMultiByte与MultiByteToWideChar
- 基本语法元素
- Ubuntu11.10 64Bit版上的Android 4.0 开发环境搭建
- 我把本人两年来的进修感觉和各人分享
- Qt利用JavaScript访问网页元素(百度博客下载例子)
- loll[lp
- MultiByteToWideChar的与WideCharToMultiByte的参数详解
- Tomcat 7.0 + eclipse 开发环境及一些说明
- 实战:Android活动目录LiveFolder开发
- 以字符串的长度由长至短或由短至长排序(冒泡排序)
- HttpSession理解 .
- EL表达式操作简明介绍
- Sicily1133.SPAM
- 四元数
- 标识符定义