WideCharToMultiByte

来源:互联网 发布:华为云计算部门 编辑:程序博客网 时间:2024/06/05 06:23

WideCharToMultiByte

                    ---Unicode转ANSI(GB2312)

     说过了MultiByteToWideChar函数,也把WideCharToMultiByte函数也说一下吧。他们的功能是相反的。这个函数能把一个UNICODE型的字串转成ANSI(GB2312)的字串。 

    看过下面的code,我想你会知道,怎麼去写一个Unicode文本文件转为GB2312文本文件的小tool了。大概思路是:一下子把文件中的所有的Unicode字串读到一个buffer里面,分析要存这个buffer,用GB2312格式要几个char型的数组,动态申请之后,再一个一个分析,用这个MultiByteToWideChar函数转成GB2312格式的字,写进文件。Free指针之后,关闭文件指针。就OK!

/////////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include <string.h>
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>

int main(void)
{
   WCHAR  wword[30] = {L"字符编码简介---NigelYan"};   //一字 UNICODE字串

   DWORD  num = WideCharToMultiByte(CP_ACP,0,wword,-1,NULL,0,NULL,0);

   //计算这个UNICODE实际有几个字组成

   char *cword;                 //ANSI指针

   cword = (char*)calloc(num,sizeof(char));   //申请空间

   if(cword == NULL)                                      //申请成功没有

   {

      free(cword);

   }

   memset(cword, 0, num*sizeof(char));     //初始化

 

   WideCharToMultiByte(CP_ACP,0, wword, -1, cword, num,NULL,0);     

   //Unicode转变为GB2312,BIG5

   free(cword) ;                //释放空间,值消失。

   return 0;

}

////////////////////////////////////////////////////////////////////////

API 函数WideCharToMultiByte参数说明
第一个参数:指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,你也可以使用如下所示代码页之一。

    CP_ACP 当前系统ANSI代码页

    CP_MACCP 当前系统Macintosh代码页

    CP_OEMCP 当前系统OEM代码页,一种原始设备制造商硬件扫描码

    CP_SYMBOL Symbol代码页.

    CP_THREAD_ACP 当前线程ANSI代码页,用于Windows 2000及以后版本,我不明白是什么

    CP_UTF7 UTF-7,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL

    CP_UTF8 UTF-8,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL

第二个参数:指定如何处理没有转换的字符,但不设此参数函数会运行的更快一些,我都是把它设为0。

第三个参数:待转换的宽字符串。

第四个参数:待转换宽字符串的长度,-1表示转换到字符串结尾。

第五个参数:接收转换后输出新串的缓冲区。

第六个参数:输出缓冲区大小。

第七个参数:指向字符的指针。

第八个参数:开关变量的指针,用以表明是否使用过默认字符,一般设为0。

    这个WideCharToMultiByte函数的功能很强大,可以把宽字符文件变成ANSI UTF-8文件,通过设置函数的参数。如果还是不知道参数的意思,就按我样的写法,确定有问题再改动,WINAP函数是一个比较麻烦的东西。

PS:如果还有不明白的地方,请参考:http://topic.csdn.net/u/20090201/22/aef91c79-7008-4772-b55d-a19990215afc.html  



wifstream fin(path);

fin.seekg(0, ios::beg);



std::ostringstream oss;
std::string szUrl;

//将CString转为std::string
CString s= S;
DWORD  num = WideCharToMultiByte(CP_ACP,0,s,-1,NULL,0,NULL,0);
char* chr = new char[num];
memset(chr, 0, num * sizeof(char));
WideCharToMultiByte(CP_ACP, 0, s.GetBuffer(), -1, chr, num, NULL, NULL);


oss << "aa" << chr << "bb";
oss << get();


szUrl = oss.str();


原创粉丝点击