,,C++ WideCharToMultiByte()函数案例详解

,,C++ WideCharToMultiByte()函数案例详解

本文主要介绍了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • vs2015打包安装程序,vs2015程序打包,VS2022实现VC++打包生成安装文件图文详细历程
  • vc++6.0的快捷键,vc 快捷键
  • vc++6.0的快捷键,vc 快捷键,VC6.0常用快捷键大全
  • 绘制圆角矩形的方法,c++ 画矩形,C#画圆角矩形的方法
  • 懒汉式和饿汉式代码,单列模式懒汉和饿汉,C++单例模式的懒汉模式和饿汉模式详解
  • 好用的C++编译器,c++编译软件哪个好
  • semaphore c#,c++ semaphore
  • semaphore c#,c++ semaphore,C++中Semaphore内核对象用法实例
  • dev-c++使用教程,dev c++安装教程
  • dev-c++使用教程,dev c++安装教程,Dev C++ 安装及使用方法(图文教程)
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针,简单总结C++中指针常量与常量指针的区别
  • com组件初始化失败,c#开发com组件,C++中COM组件初始化方法实例分析
  • c++静态成员变量使用,c++静态成员函数和静态成员变量
  • c++静态成员变量使用,c++静态成员函数和静态成员变量,详解c++ 静态成员变量
  • 留言与评论(共有 条评论)
       
    验证码: