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

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

(0)

相关推荐

  • C++中可正确获取UTF-8字符长度的函数分享

    在C++的char*以及string中,使用的是字节流编码,即sizeof(char) == 1. 也就是说,C++是不区分字符的编码的. 而一个合法UTF8的字符长度可能为1-4位. 现在假设一串输入为UTF8编码,如何能准确的定位到每个UTF8字符的"CharPoint",而不会错误的分割字符呢? 参考这个页面:http://www.nubaria.com/en/blog/?p=289 可以改造出下面的函数: const unsigned char kFirstBitMask =

  • 浅析c++ 宏 #val 在unicode下的使用

    #define CHECK(condition) cout<<check failed:<<#condition<<endl; 上面这句宏,当你 CHECK(myfunc()); 时,假设myfunc返回false,会输出:check failed:myfunc() 在宏中,#condition 是把参数转换为字符串,这在打印log时,可以很方便的打印出函数名称等等 这个大家可能都知道了,太小儿科了,但是,当你在unicode下用的时候,很可能会出现乱码 解决的办法是

  • php使用fopen创建utf8编码文件的方法

    本文实例讲述了php使用fopen创建utf8编码文件的方法.分享给大家供大家参考.具体实现方法如下: 一般来说,如果我们直接使用fopen创建会发现文件编码都不是uft-8的了,那么如果要创建uft8文件我们需要进行一些技术处理.具体步骤如下: 使用PHP创建编码格式为utf-8文件的方法: 第一步:新建一个txt文件,打开,文件->另存为xxx.php,并将编码改为UTF-8,保存. 第二部:在php文件中加入如下代码: 复制代码 代码如下: <?php $filename=rand(10

  • asp解密、还原chrw、chr编码文件的方法

    将asp函数的参数通过chrw编码加密后,如何解码chrw内容.下面的解码函数,原来很简单,用正则提取内容中的chrw串,然后eval动态执行获取的chrw串得到内容,再执行替换即可.注意事项参考源代码里面的注释,注意将源代码保存为vbs格式的文件后执行,如果是asp文件,需要将createobject修改为server.createobject. function readfile(fn)'读取编码文件的内容 set fso=createobject("scripting.filesystem

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

    WideCharToMultiByte函数映射一个unicode字符串到一个多字节字符串. 函数原型: int WideCharToMultiByte UINT CodePage, //指定执行转换的代码页 DWORD dwFlags, //允许你进行额外的控制,它会影响使用了读音符号(比如重音)的字符 LPCWSTR lpWideCharStr, //指定要转换为宽字节字符串的缓冲区 int cchWideChar, //指定由参数lpWideCharStr指向的缓冲区的字符个数 LPSTR

  • ANSI,Unicode,BMP,UTF等编码概念实例讲解

    一.前言 其实从开始写Java代码以来,我遇到过无数次乱码与转码问题,比如从文本文件读入到String出现乱码,Servlet中获取HTTP请求参数出现乱码,JDBC查询到的数据乱码等等,这些问题很常见,遇到的时候随手搜一下都可以顺利解决,所以没有深入的去了解. 直到前两天同学与我谈起一个Java源文件的编码问题(这问题在最后一个实例分析),从这个问题入手拉扯出了一连串的问题,然后我们一边查资料一边讨论,直到深夜,终于在一篇博客中找到了关键性线索,解决了所有的疑惑,以前没有理解的语句都能解释清楚

  • php使用指定编码导出mysql数据到csv文件的方法

    本文实例讲述了php使用指定编码导出mysql数据到csv文件的方法.分享给大家供大家参考.具体实现方法如下: <?php /* * PHP code to export MySQL data to CSV * * Sends the result of a MySQL query as a CSV file for download * Easy to convert to UTF-8. */ /* * establish database connection */ $conn = mysq

  • Python 2/3下处理cjk编码的zip文件的方法

    今天项目中遇到了中文编码的zip文件,处理了蛮长时间,所以记录下,以免下次踩坑. Python2下 Python2中读取zip文件,zipfile.ZipInfo的filename类型是str,基本上类似于python3中的bytes,即可以被decode为unicode. 所以,要处理中文,只需要将文件名按照编码decode成unicode就好. import zipfile fpath = '/path/to/zip.zip' zfile = zipfile.ZipFile(fpath, '

  • Java在创建文件时指定编码的实现方法

    目录 一.问题分析 二.字符编码 三 .问题解决 前言:最近,学习了Java IO流的相关的知识,想通过读写文件的方式练习和巩固所学知识.在使用File类创建文件时,突然想到,我该如何指定文件使用的编码呢? 进而想到,应该如何查看一个文件的编码呢? 一.问题分析 先去互联网上查找答案,结果如下: FileInputStream fis=new FileInputStream("xxxx.txt"): OutputStreamWriter osw=new OutputStreamWrit

  • Python中字符编码简介、方法及使用建议

    1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Information Interchange),是一种单字节的编码.计算机世界里一开始只有英文,而单字节可以表示256个不同的字符,可以表示所有的英文字符和许多的控制符号.不过ASCII只用到了其中的一半(\x80以下),这也是MBCS得以实现的基础. 1.2. MBCS 然而计算机世界里很快就有了其他语言,单字节的ASCII已无法满足需求.后来每个语言就制定了一套自己的编码,由于单字节

  • VC中实现GB2312、BIG5、Unicode编码转换的方法

    本文主要以实例形式讨论了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

  • php头编码实例设置方法及代码

    在PHP中可以通过在PHP文件头部添加"header("Content-type: text/html; charset=utf-8");"语句来设置编码. 设置utf编码的代码如下: header("Content-type: text/html; charset=utf-8"); 注:通常情况以上代码放在php页面的首页 header() 函数向客户端发送原始的 HTTP 报头. 附: php页面为gbk编码 header("Con

随机推荐