C++使用WideCharToMultiByte函数生成UTF-8编码文件的方法_C 语言

WideCharToMultiByte函数映射一个unicode字符串到一个多字节字符串。

函数原型:

int WideCharToMultiByte
  • UINT CodePage, //指定执行转换的代码页
  • DWORD dwFlags, //允许你进行额外的控制,它会影响使用了读音符号(比如重音)的字符
  • LPCWSTR lpWideCharStr, //指定要转换为宽字节字符串的缓冲区
  • int cchWideChar, //指定由参数lpWideCharStr指向的缓冲区的字符个数
  • LPSTR lpMultiByteStr, //指向接收被转换字符串的缓冲区
  • int cchMultiByte, //指定由参数lpMultiByteStr指向的缓冲区最大值
  • LPCSTR lpDefaultChar, //遇到一个不能转换的宽字符,函数便会使用pDefaultChar参数指向的字符
  • LPBOOL pfUsedDefaultChar //至少有一个字符不能转换为其多字节形式,函数就会把这个变量设为TRUE

参数:
CodePage:指定执行转换的代码页,这个参数可以为系统已安装或有效的任何代码页所给定的值。你也可以指定其为下面的任意一值:

  • CP_ACP:ANSI代码页;CP_MACCP:Macintosh代码页;CP_OEMCP:OEM代码页;
  • CP_SYMBOL:符号代码页(42);CP_THREAD_ACP:当前线程ANSI代码页;
  • CP_UTF7:使用UTF-7转换;CP_UTF8:使用UTF-8转换。

相关变量

  • lpWideCharStr:指向将被转换的unicode字符串。
  • cchWideChar:指定由参数lpWideCharStr指向的缓冲区的字符个数。如果这个值为-1,字符串将被设定为以NULL为结束符的字符串,并且自动计算长度。
  • lpMultiByteStr:指向接收被转换字符串的缓冲区。
  • cchMultiByte:指定由参数lpMultiByteStr指向的缓冲区最大值(用字节来计量)。若此值为零,函数返回lpMultiByteStr指向的目标缓冲区所必需的字节数,在这种情况下,lpMultiByteStr参数通常为NULL。
  • lpDefaultChar和pfUsedDefaultChar:只有当WideCharToMultiByte函数遇到一个宽字节字符,而该字符在uCodePage参数标识的代码页中并没有它的表示法时,WideCharToMultiByte函数才使用这两个参数。如果宽字节字符不能被转换,该函数便使用lpDefaultChar参数指向的字符。如果该参数是NULL(这是大多数情况下的参数值),那么该函数使用系统的默认字符。该默认字符通常是个问号。这对于文件名来说是危险的,因为问号是个通配符。pfUsedDefaultChar参数指向一个布尔变量,如果Unicode字符串中至少有一个字符不能转换成等价多字节字符,那么函数就将该变量置为TRUE。如果所有字符均被成功地转换,那么该函数就将该变量置为FALSE。当函数返回以便检查宽字节字符串是否被成功地转换后,可以测试该变量。
  • 返回值:如果函数运行成功,并且cchMultiByte不为零,返回值是由 lpMultiByteStr指向的缓冲区中写入的字节数;如果函数运行成功,并且cchMultiByte为零,返回值是接收到待转换字符串的缓冲区所必需的字节数。如果函数运行失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。它可以返回下面所列错误代码:
  • ERROR_INSUFFICIENT_BJFFER;ERROR_INVALID_FLAGS;
  • ERROR_INVALID_PARAMETER;ERROR_NO_UNICODE_TRANSLATION。
  • 注意:指针lpMultiByteStr和lpWideCharStr必须不一样。如果一样,函数将失败,GetLastError将返回ERROR_INVALID_PARAMETER的值。
  • Windows CE:不支持参数CodePage中的CP_UTF7和CP_UTF8的值,以及参数dwFlags中的WC_NO_BEST_FIT_CHARS值。

生成utf-8编码的文件
步骤如下:
1. 首先要写一个BOM头。UTF-8文件一般是要这个头的,当然也可以没有。
2. 将要生成的字符先使用宽字符格式生成,然后调用WideCharToMultiByte转为utf-8编码,写入文件。

例子如下:

FILE * pFile = fopen("d://a.txt", "w");
  char szBOM[4] = {(char)0xEF, (char)0xBB, (char)0xBF, 0};
  fprintf(pFile, "%s", szBOM); 

  wchar_t chNum[11] = L"零壹贰叁肆伍陆柒捌玖";
  wchar_t chNum2[10] = L"亿千百拾万千百拾个";
  char sz[10] = "112304823"; 

  wchar_t result[32] = L""; 

  int offset = 0;
  for(int i = 0; i < strlen(sz); ++ i)
  {
    char c = sz[i]; 

    wchar_t w1 = chNum[ c - '0'];
    wchar_t w2 = chNum2[i];
    swprintf(result + offset, L"%c%c", w1, w2);
    offset += 2;
  }
  char szChar[64] = "";
  ::WideCharToMultiByte(CP_UTF8, 0, result, wcslen(result), szChar, 64, 0, 0);
  fprintf(pFile, "%s", szChar);
  fclose(pFile);

注意的是,当使用wchar_t而不再是char时,所有的字符串操作函数都需要时w系列的,例如wcslen、swprintf

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, 字符串
, utf-8
unicode
易语言中文转utf8编码、易语言 utf8编码、易语言url编码 utf8、widechartomultibyte、utf8编码转换器,以便于您获取更多的相关知识。

时间: 2024-09-13 15:28:09

C++使用WideCharToMultiByte函数生成UTF-8编码文件的方法_C 语言的相关文章

VC中实现GB2312、BIG5、Unicode编码转换的方法_C 语言

本文主要以实例形式讨论了VC编译环境下,实现字符串和文件编码方式转换的方法,在linux下请使用Strconv来实现.具体方法如下: 一.文件编码格式转换 //GB2312 编码文件转换成 Unicode: if((file_handle = fopen(filenam,"rb")) != NULL) { //从GB2312源文件以二进制的方式读取buffer numread = fread(str_buf_pool,sizeof(char),POOL_BUFF_SIZE,file_h

C语言按关键字搜索文件夹中文件的方法_C 语言

本文实例讲述了C语言按关键字搜索文件夹中文件的方法.分享给大家供大家参考.具体实现方法如下: 方法1: #include<iostream> #include<string> #include<io.h> using namespace std; void filesearch(string path,string mode) { struct _finddata_t filefind; if(path[path.size()-1]=='\\') path.resize

C++遍历文件夹下文件的方法_C 语言

本文实例讲述了C++遍历文件夹下文件的方法.分享给大家供大家参考.具体如下: #include <windows.h> #include <stdio.h> #include <string.h> #define LEN 1024 // 深度优先递归遍历目录中所有的文件 BOOL DirectoryList(LPCSTR Path) { WIN32_FIND_DATA FindData; HANDLE hError; int FileCount = 0; char Fi

C语言使用libZPlay录制声音并写到文件的方法_C 语言

本文实例讲述了C语言使用libZPlay录制声音并写到文件的方法.分享给大家供大家参考.具体实现方法如下: /** * Record samples from line-in and save to out.mp3 * */ #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <olectl.h> #include <ole2.h> #include <stdio.h> #include <

C语言实现清空指定文件夹中所有文件的方法_C 语言

本文实例讲述了C语言实现清空指定文件夹中所有文件的方法.分享给大家供大家参考.具体分析如下: 最近笔者在做一个有关计算机视觉的项目,需要对提前的视频帧进行实验,当数据量很大且文件夹中的子文件夹和文件很多时,手工删除这些文件不现实,笔者今天写了一个程序,通过机器自动删除所有相关文件,十分快速,删除时间几乎可以不计. 代码如下,仅供参考. #include "iostream.h" //代码如需调试,只需将改成""即可 #include "string.h&q

VC++创建msi文件的方法_C 语言

采用VC++可以编写自己软件的安装程序.这里只是创建安装程序类型的msi文件,用orca打开是正确的文件格式,值得自己记录一下了,msi数据库里面的各种表关系复杂,不是一时半刻能研究清楚的.本文仅作一浅析,实现写一个程序附到软件程序的后面,这样可以在编译完成后直接会有安装程序msi文件.就像平常下载的软件,可以写注册表,创建桌面快捷方式,注册各种软件用到的组件和功能. 具体示例程序如下: #pragma once //CRT headers. #include <TCHAR.H> //wind

VC实现批量删除指定文件的方法_C 语言

本文所述实例主要实现了删除某个盘符下指定位置的文件,可以是TXT.doc.jpeg等格式,只要选定格式后,再定义好盘符,即可一键删除所有指定类型的文件.再次提示删除前请确认,且删除后不可恢复. 以下是最主要的核心代码,其它代码读者可以自己添加. SHFILEINFO shInfo; memset(&shInfo,0,sizeof(SHFILEINFO)); HIMAGELIST hImage = (HIMAGELIST)SHGetFileInfo("C:\\",0,&s

C++读写.mat文件的方法_C 语言

最近在编写C++程序的过程中,需要使用matlab生成的.mat文件,于是查找了基本使用方法.  我的计算机环境是win7 64位系统,VS2010,matlab R2010b.  一.工程配置:  1.VC++目录->包含目录 添加:  MATLAB\R2010b\extern\include  MATLAB\R2010b\extern\include\win64   ->库目录 添加:    MATLAB\R2010b\extern\lib\win64\microsoft    MATLA

VC WinExec打开指定程序或者文件的方法_C 语言

⑴ 函数原型: UINT Win Exec(LPCSTR lpCmdLine, UINT uCmdShow); ⑵ 参数: lpCmdLine:指向一个空结束的字符串,串中包含将要执行的应用程序的命令行(文件名加上可选参数). uCmdShow:定义Windows应用程序的窗口如何显示,并为CreateProcess函数提供STARTUPINFO参数的wShowWindow成员的值. ⑶ 返回值: 若函数调用成功,则返回值大于31.若函数调用失败,则返回值为下列之一: ① 0:系统内存或资源已耗