本文主要介绍了C WideCharToMultiByte()函数的用例的详细说明。本文通过一个简单的案例来说明对这项技术的理解和使用。以下是详细内容,有需要的朋友可以参考一下。
函数WideCharToMultiByte() 详解
函数原型:
int WideCharToMultiByte(
UINT代码页,
DWORD dwFlags,
LPWSTR lpWideCharStr,
int cchWideChar,
LPCSTR lpMultiByteStr,
int多字节,
LPCSTR lpDefaultChar,
PBOOL pfUsedDefaultChar
);
函数功能:
该函数将宽字符串转换为指定的新字符串,如ANSI、UTF8等。新字符串不必是多字节字符集。
(—Unicode转ANSI(GB2312),UTF8)
参数:
Code:指定执行转换的代码页。该参数可以是系统中安装的或有效的任何代码页给定的值。
CP_ACP
当前系统ANSI代码页
CP_MACCP
当前系统Macintosh代码页
CP_OEMCP
当前系统OEM代码页,一个OEM硬件扫描代码。
CP _符号
代码页(42)
CP_THREAD_ACP
当前线程的ANSI代码页
DwFlags:指定如何处理没有被转换的字符,但是如果没有这个参数,函数会运行得更快。我总是把它设置为0。
可设的值如下表所示:
WC _ NO _最佳拟合_字符
将无法直接转换为相应多字节字符的Unicode字符转换为由lpDefaultChar指定的默认字符。也就是说,如果您将Unicode转换为多字节字符,然后再转换回来,您可能不会获得相同的Unicode字符,因为在此期间可能会使用默认字符。该选项可以单独使用,也可以与其他选项一起使用。
WC _复合检查
将合成字符转换为预制字符。它可以与最后三个选项中的任何一个结合使用。如果不与其中任何一个组合,则与选项WC_SEPCHARS相同。
WC _ ERR _无效字符
该选项会导致函数在遇到无效字符时无法返回,GetLastError会返回错误代码ERROR_NO_UNICODE_TRANSLATION。否则,该函数将自动丢弃非法字符。此选项只能用于UTF8。
WC _废弃
转换以丢弃不占用空间的字符,并与WC_COMPOSITECHECK一起使用。
WC_SEPCHARS
转换时,会生成一个单独的字符。这是默认的转换选项,和WC_COMPOSITECHECK一起使用。
WC _默认字符
转换时使用默认字符而不是异常字符,(最常见的是'?'),与WC_COMPOSITECHECK一起使用。
LpWideCharStr:要转换的宽字符串。
CchWideChar:要转换的宽字符串的长度;-1表示转换到字符串的末尾。
LpMultiByteStr:用于接收和输出转换后的新字符串的缓冲区。
Cbbyte:输出缓冲区大小。如果为0,将忽略lpMultiByteStr,函数将返回所需的缓冲区大小,而不使用lpMultiByteStr。
LpDefaultChar:指向一个字符的指针,当在指定的代码中找不到相应的字符时,该指针用作默认字符。如果为空,则使用系统默认字符。如果此参数用于要求此参数为NULL的dwFlags,则函数将无法返回并设置错误代码ERROR_INVALID_PARAMETER。
LpUsedDefaultChar:一个指向开关变量的指针,指示是否使用了默认字符。如果此参数用于要求此参数为NULL的dwFlags,则函数将无法返回并设置错误代码ERROR_INVALID_PARAMETER。lpDefaultChar和lpUsedDefaultChar都设置为NULL,函数会更快。
返回值:如果函数成功且cbMultiByte不为0,则返回写入lpMultiByteStr的字节数(包括null);在字符串的末尾);如果cbMultiByte为0,则返回转换所需的字节数。函数失败并返回0。
注意:WideCharToMultiByte使用不当会影响程序的安全性。调用这个函数很容易导致内存泄漏,因为lpWideCharStr指向的输入缓冲区大小是宽字符数,而lpMultiByteStr指向的输出缓冲区大小是字节数。为了避免内存泄漏,请确保为输出缓冲区指定适当的大小。我的方法是调用一次WideCharToMultiByte来获取所需的缓冲区大小,为缓冲区分配空间,然后再次调用WideCharToMultiByte来填充缓冲区。有关详细信息,请参见以下代码。此外,从Unicode UTF16到非Unicode字符集的转换可能会导致数据丢失,因为字符集可能无法找到代表特定Unicode数据的字符。
demo1
wchar_t* pwszUnicode=L'Holle,word!你好,中国!
int iSize
char * pszMultiByte
iSize=WideCharToMultiByte(CP _ ACP,0,pwszUnicode,-1,NULL,0,NULL,NULL);
pszmultybyte=(char *)malloc(iSize * sizeof(char));
WideCharToMultiByte(CP_ACP,0,pwszUnicode,-1,pszMultiByte,iSize,NULL,NULL);
demo2
int n;
CString noUser=_T('我是demo 2 ');
//获取所需的缓冲区大小N,并为缓冲区分配空间
n=WideCharToMultiByte(CP_OEMCP,0,noUser,-1,NULL,0,0,FALSE);
//m_strNoUser:接收转换后的新字符串并输出的缓冲区。
m _ strNoUser=new char[n];
memset(m_strNoUser,0,n * sizeof(char));
WideCharToMultiByte(CP_OEMCP,0,noUser。GetBuffer(0),n,m_strNoUser,n,0,FALSE);
这就是本文关于C WideCharToMultiByte()函数的详细解释。有关C WideCharToMultiByte()函数的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。