MultiByteToWideChar和WideCharToMultiByte用法详解

作者在 2009-06-15 22:40:25 发布以下内容
//========================================================================
//TITLE:
//    MultiByteToWideChar和WideCharToMultiByte用法详解
//AUTHOR:
//    norains
//DATE:
//    第一版:Monday  25-December -2006
//    增补版:Wednesday 27-December -2006
//    修订版:Wednesday 14-March-2007 (修正之前的错误例子)
//Environment:
//  EVC4.0 + Standard SDK
//========================================================================
 
1.使用方法详解

  在本文开始之处,先简要地说一下何为短字符和宽字符.
  所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码.而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE.关于windows下的ASCII和UNICODE的更多信息,可以参考这两本经典著作:《windows 程序设计》,《windows 核心编程》.这两本书关于这两种字符都有比较详细的解说.
 
  宽字符转换为多个短字符是一个难点,不过我们只要掌握到其中的要领,便可如鱼得水.
  好吧,那就让我们开始吧.
 
  这个是我们需要转化的多字节字符串:  
  char sText[20] = {"多字节字符串!OK!"};
 
  我们需要知道转化后的宽字符需要多少个数组空间.虽然在这个里程里面,我们可以直接定义一个20*2宽字符的数组,并且事实上将运行得非常轻松愉快.但假 如多字节字符串更多,达到上千个乃至上万个,我们将会发现其中浪费的内存将会越来越多.所以以多字节字符的个数的两倍作为宽字符数组下标的声明绝对不是一 个好主意.
  所幸,我们能够确知所需要的数组空间.
  我们只需要将MultiByteToWideChar()的第四个形参设为-1,即可返回所需的短字符数组空间的个数:
  DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, sText, -1, NULL, 0);
 
  接下来,我们只需要分配响应的数组空间:
  wchar_t *pwText;
  pwText = new wchar_t[dwNum];
  if(!pwText)
  {
   delete []pwText;
  }
 
  接着,我们就可以着手进行转换了.在这里以转换成ASCII码做为例子:
  MultiByteToWideChar (CP_ACP, 0, psText, -1, sText, dwSize);
 
  最后,使用完毕当然要记得释放占用的内存:
  delete []psText;
 
 
  同理,宽字符转为多字节字符的代码如下:  
  wchar_t wText[20] = {L"宽字符转换实例!OK!"};
  DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);
  char *psText;
  psText = new char[dwNum];
  if(!psText)
  {
   delete []psText;
  }
  WideCharToMultiByte (CP_OEMCP,NULL,lpcwszStr,-1,psText,dwNum,NULL,FALSE);
  delete []psText;
 
   如果之前我们已经分配好空间,并且由于字符串较短,可以不理会浪费的空间,仅仅只是想简单地将短字符和宽字符相互转换,那有没有什么简便的方法呢?
   WIN32 API里没有符合这种要求的函数,但我们可以自己进行封装:
     
  //-------------------------------------------------------------------------------------
  //Description:
  // This function maps a character string to a wide-character (Unicode) string
  //
  //Parameters:
  // lpcszStr: [in] Pointer to the character string to be converted
  // lpwszStr: [out] Pointer to a buffer that receives the translated string.
  // dwSize: [in] Size of the buffer
  //
  //Return Values:
  // TRUE: Succeed
  // FALSE: Failed
  //
  //Example:
  // MByteToWChar(szA,szW,sizeof(szW)/sizeof(szW[0]));
  //---------------------------------------------------------------------------------------
  BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize)
  {
    // Get the required size of the buffer that receives the Unicode
    // string.
    DWORD dwMinSize;
    dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);
 
    if(dwSize < dwMinSize)
    {
     return FALSE;
    }
 
    
    // Convert headers from ASCII to Unicode.
    MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);  
    return TRUE;
  }
 
  //-------------------------------------------------------------------------------------
  //Description:
  // This function maps a wide-character string to a new character string
  //
  //Parameters:
  // lpcwszStr: [in] Pointer to the character string to be converted
  // lpszStr: [out] Pointer to a buffer that receives the translated string.
  // dwSize: [in] Size of the buffer
  //
  //Return Values:
  // TRUE: Succeed
  // FALSE: Failed
  //
  //Example:
  // MByteToWChar(szW,szA,sizeof(szA)/sizeof(szA[0]));
  //---------------------------------------------------------------------------------------
  BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize)
  {
   DWORD dwMinSize;
   dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);
   if(dwSize < dwMinSize)
   {
    return FALSE;
   }
   WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE);
   return TRUE;
  }
 
 
  使用方法也很简单,示例如下:
  wchar_t wText[10] = {L"函数示例"};
  char sText[20]= {0};
  WCharToMByte(wText,sText,sizeof(sText)/sizeof(sText[0]));
  MByteToWChar(sText,wText,sizeof(wText)/sizeof(wText[0]));
 
  这两个函数的缺点在于无法动态分配内存,在转换很长的字符串时可能会浪费较多内存空间;优点是,在不考虑浪费空间的情况下转换较短字符串非常方便.

 
2.MultiByteToWideChar()函数乱码的问题

  有的朋友可能已经发现,在标准的WinCE4.2或WinCE5.0 SDK模拟器下,这个函数都无法正常工作,其转换之后的字符全是乱码.及时更改MultiByteToWideChar()参数也依然如此.
  不过这个不是代码问题,其结症在于所定制的操作系统.如果我们定制的操作系统默认语言不是中文,也会出现这种情况.由于标准的SDK默认语言为英文,所以 肯定会出现这个问题.而这个问题的解决,不能在简单地更改控制面板的"区域选项"的"默认语言",而是要在系统定制的时候,选择默认语言为"中文".
  系统定制时选择默认语言的位置于:
  Platform -> Setting... -> locale -> default language ,选择"中文",然后编译即可.
编码 | 阅读 12052 次
文章评论,共9条
vfdff(作者)
2009-06-15 22:40
1
CString my_strEditA=_T(&quot;&quot;),my_strEditB=_T(&quot;&quot;),my_strEditC=_T(&quot;&quot;); <br />
&nbsp;&nbsp;&nbsp;my_strlength = my_Base64Msg.GetLength();<br />
&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;*pstra = new char[my_strlength];<br />
&nbsp;&nbsp;&nbsp;for(i=0;i&lt;my_strlength;i++) <br />
&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp; *(pstra+i)=(char)my_Base64Msg[i]; <br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;my_testA = pstra; <br />
<br />
&nbsp;&nbsp;//BASE64解码函数,见另一篇博文 <br />
&nbsp;&nbsp;&nbsp;my_testB = decode(my_testA);<br />
&nbsp;&nbsp;&nbsp;///////////////////////////////////////////////////////////////////<br />
&nbsp;&nbsp;&nbsp;///////////////////////////////////////////////////////////////////<br />
<br />
&nbsp;&nbsp;//获取转换字符串长度<br />
&nbsp;&nbsp;&nbsp;DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, my_testB, -1, NULL, 0);<br />
&nbsp;&nbsp;&nbsp;wchar_t *pwText;<br />
&nbsp;&nbsp;&nbsp;pwText = new wchar_t[dwNum];<br />
&nbsp;&nbsp;&nbsp; if(!pwText)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp; delete []pwText;<br />
&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;//转换成UNICODE码<br />
<br />
&nbsp;&nbsp;//CP_ACP=936,简体中文<br />
&nbsp;&nbsp;&nbsp;MultiByteToWideChar (CP_ACP, 0 , my_testB, -1, pwText, dwNum);<br />
&nbsp;&nbsp;&nbsp;m_EditMail += pwText;<br />
&nbsp;&nbsp;&nbsp;delete []pwText;
vfdff(作者)
2009-06-15 22:41
2
**************************************************************&nbsp;&nbsp;<br />
*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;功&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;能: 将unicode字符转换成gb2312字串&nbsp;&nbsp;<br />
*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;参&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数: unistr 源字串&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gbstr 目标字串&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg_len 源串长度&nbsp;&nbsp;<br />
*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返&nbsp;&nbsp;&nbsp;回&nbsp;&nbsp;&nbsp;值: 无&nbsp;&nbsp;<br />
**************************************************************&nbsp;&nbsp;<br />
void str_unic_decode( unsigned short *unistr, unsigned char *gbstr, int msg_len)&nbsp;&nbsp;<br />
{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;i;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;index;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; unsigned&nbsp;&nbsp;&nbsp;short&nbsp;&nbsp;&nbsp;ch;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; unsigned&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;str[2];&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; msg_len&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;msg_len==-1?&nbsp;&nbsp;str_unic_len(unistr)&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;msg_len;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; for(i=0,index=0;&nbsp;&nbsp;&nbsp;i&lt;msg_len;&nbsp;&nbsp;&nbsp;i++)&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;UNICODE_TO_GB2312[unistr[i]]; //查表法 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str[0]&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;ch&nbsp;&nbsp;&nbsp;&amp;&nbsp;&nbsp;&nbsp;0xff;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str[1]&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;ch&gt;&gt;8&nbsp;&nbsp;&nbsp;&amp;&nbsp;&nbsp;&nbsp;0xff;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(str[1]&nbsp;&nbsp;&nbsp;&gt;&nbsp;&nbsp;&nbsp;0xa0)&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gbstr[index++]&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;str[0];&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gbstr[index++]&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;str[1];&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gbstr[index++]&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;str[0];&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;<br />
}
vfdff(作者)
2009-06-15 22:50
3
UTF-8<br />
  现在明白了Unicode,那么UTF-8又是什么呢?又为什么会出现UTF-8呢?<br />
  ASCII转换成UCS-2,只是在编码前插入一个0x0。用这些编码,会包括一些控制符,比如 '' 或 '/',这在UNIX和一些C函数中,将会产生严重错误。因此可以肯定,UCS-2不适合作为Unicode的外部编码。<br />
  因此,才诞生了UTF-8。那么UTF-8是如何编码的?又是如何解决UCS-2的问题呢?<br />
例:<br />
E4 BD A0        11100100 10111101 10100000<br />
这是“你”字的UTF-8编码<br />
4F 60          01001111 01100000<br />
这是“你”的Unicode编码<br />
按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000<br />
把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。<br />
注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。<br />
经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。<br />
<br />
以下是Unicode和UTF-8之间的转换关系表:<br />
U-00000000 - U-0000007F: 0xxxxxxx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //没有1表示只有1个字节<br />
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx&nbsp;&nbsp;//前面2个1表示由2个字节<br />
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx //前面3个1表示由3个字节<br />
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx //依次类推<br />
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx<br />
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx<br />
Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了。<br />
<br />
<br />
所以,可以看到unicode编码和utf-8编码有线性转换关系,而unicode编码和gb2312编码不存在线性转换关系,所以我们必须使用对照表来进行unicode和gb2312编码的互换,就像阳历和农历转换算法一样,不能作线性计算
vfdff(作者)
2009-06-15 23:10
4
由于各种编码之间不存在互相变换的算法,只能通过查表解决转换问题。自编代码进行转换在嵌入式系统中最有实际意义,该方法具有最方便的移植特性和最小的代码量。需要解决的主要技术问题有:<br />
<br />
·获取所需的编码转换表<br />
<br />
·实现码表的快速搜索算法(UTF-8转GB码才需要,其实就是折半查找)<br />
<br />
·待转换字符串中的中/西文字符判别<br />
<br />
由于折半查找要求码表是事先排序的,正变换和反变换需要各有一张转换表。转换表可以从开源软件中获取也可以自己编段程序生成一份。<br />
<br />
由于非unicode编码字串中的西文字母只有一字节/字符,而汉字是2字节/字符,需要在转换时区别对待。判断方法在本文的前面部分有介绍。<br />
<br />
由GB2312码转unicode时,由于转换表是按区位表排列的,可以直接由汉字的GB码通过计算得到转换表中的行列值,计算公式为:<br />
<br />
Row = MSB - 0xA0 - 16<br />
<br />
Col = LSB – 0xA0<br />
<br />
由于转换表是从汉字区开始的,即第一个汉字是“啊”,开始行不是0,而是16,所以要从行值中减去一个偏移量。得到行列值后,可以直接取回表中的unicode:<br />
<br />
Unicode = CODE_LUT[Row][Col];<br />
<br />
今天对网上找到的转换表不太满意,于是自己编程序生成了一个新的。转换程序不大,全部源码如下:<br />
<br />
// UnicodeCvt.cpp<br />
// by mxh0506, 20081102<br />
<br />
#include &quot;stdafx.h&quot;<br />
#include &lt;string.h&gt;<br />
#include &lt;windows.h&gt;<br />
<br />
<br />
<br />
int _tmain(int argc, _TCHAR* argv[])<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wchar_t wstr[8];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char szBuff[8];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILE *fp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned char rowCode,colCode;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char szStr[64];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char szErr[16];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(szErr,&quot;/*XX*/0x0000,&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fp = fopen(&quot;GB2Uni_LUT.h&quot;, &quot;w+, ccs=UNICODE&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( fp ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy( szStr, &quot;unsigned short Unicode[72][96]={\n&quot;); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwrite(szStr,1,strlen(szStr),fp);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;szBuff[2] = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for( unsigned char row = 0; row &lt; 72; row++){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( unsigned char col = 0; col &lt; 96; col++){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rowCode = (row + 16) + 0xA0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;colCode = col + 0xA0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;szBuff[0] = rowCode;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;szBuff[1] = colCode;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( MultiByteToWideChar(CP_THREAD_ACP,MB_ERR_INVALID_CHARS,szBuff,2,wstr,8)){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(szStr,&quot;/*%s%X*/0x%X,&quot;,szBuff,*((unsigned short*)szBuff),wstr[0]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwrite(szStr,1,strlen(szStr),fp);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwrite( szErr, 1, 13, fp );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fwrite( &quot;\n&quot;, 1, 1, fp );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy( szStr, &quot;};\n&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwrite( szStr, 1, strlen( szStr ), fp );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
}<br />
<br />
后来测试发现这段程序成生的码表中丢掉了几个花括号,不过大体功能还是正确的。如果有人感兴趣,可以加上。另外,还可以试试码表从0行(而不是16行)开始会怎样。
vfdff(作者)
2009-06-15 23:30
5
GB2312与unicode间的转换 <br />
<br />
GB2312与unicode互转的两个函数,有点简陋,待转换的字符串长度要在256以内。<br />
<br />
 <br />
static int<br />
_convertCharSetFromGBKToUnicode(char *from, char *to)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iconv_t h;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char tmp_from[256] = { '\0' };<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char tmp_to[256] = { '\0' };<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *p_from = tmp_from;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *p_to = tmp_to;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int size_from, size_to;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strncpy(p_from, from, sizeof(tmp_from)-1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_from = strlen(p_from);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_to = sizeof(tmp_to);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((h = iconv_open(&quot;UTF-8&quot;, &quot;GBK&quot;)) &lt; 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iconv(h, &amp;p_from, &amp;size_from, &amp;p_to, &amp;size_to);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iconv_close(h);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;GBK Code : %s, UNICODE Code : %s %d\n&quot;, tmp_from, tmp_to, size_to);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strncpy(to, tmp_to, size_to);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
}<br />
<br />
static int<br />
_convertCharSetFromUnicodeToGBK(char *from, char *to)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iconv_t h;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char tmp_from[256] = { '\0' };<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char tmp_to[256] = { '\0' };<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *p_from = tmp_from;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *p_to = tmp_to;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int size_from, size_to;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strncpy(p_from, from, sizeof(tmp_from)-1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_from = strlen(p_from);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_to = sizeof(tmp_to);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((h = iconv_open(&quot;GBK&quot;, &quot;UTF-8&quot;)) &lt; 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iconv(h, &amp;p_from, &amp;size_from, &amp;p_to, &amp;size_to);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iconv_close(h);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;UNICODE Code : %s, GBK Code : %s %d\n&quot;, tmp_from, tmp_to, size_to);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strncpy(to, tmp_to, size_to);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
}
vfdff(作者)
2009-06-15 23:43
6
Linux下转换字符集(UTF8转换) 借鉴此文自己已成功在LInux上实现gtk中 从UTF8到GB的转换<br />
在LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现,只不过后者是针对文件的,即将指定文件从一种编码转换为另一种编码。<br />
一、利用iconv函数族进行编码转换<br />
iconv函数族的头文件是iconv.h,使用前需包含之。<br />
#include &lt;iconv.h&gt;<br />
iconv函数族有三个函数,原型如下:<br />
(1) iconv_t iconv_open(const char *tocode, const char *fromcode);<br />
此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。<br />
(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);<br />
此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。<br />
(3) int iconv_close(iconv_t cd);<br />
此函数用于关闭转换句柄,释放资源。<br />
例子1: 用C语言实现的转换示例程序<br />
<br />
/* f.c : 代码转换示例C程序 */具体讲,自己的验证实现是根据文中的f.c实现的<br />
#include &lt;iconv.h&gt;<br />
#define OUTLEN 255<br />
main()<br />
{<br />
char *in_utf8 = &quot;姝e?ㄥ??瑁?&quot;;&lt;=======此字符串似乎并不是“正在安装”四个字的UTF8的对照串,<br />
char *in_gb2312 = &quot;正在安装&quot;;<br />
char out[OUTLEN];<br />
<br />
//unicode码转为gb2312码<br />
rc = u2g(in_utf8,strlen(in_utf8),out,OUTLEN);<br />
printf(&quot;unicode--&gt;gb2312 out=%sn&quot;,out);<br />
//gb2312码转为unicode码<br />
rc = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN);<br />
printf(&quot;gb2312--&gt;unicode out=%sn&quot;,out);<br />
}<br />
//代码转换:从一种编码转为另一种编码<br />
int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)<br />
{<br />
iconv_t cd;<br />
int rc;<br />
char **pin = &inbuf;<br />
char **pout = &outbuf;<br />
<br />
cd = iconv_open(to_charset,from_charset);<br />
if (cd==0) return -1;<br />
memset(outbuf,0,outlen);<br />
if (iconv(cd,pin,&amp;inlen,pout,&amp;outlen)==-1) return -1;<br />
iconv_close(cd);<br />
return 0;<br />
}<br />
//UNICODE码转为GB2312码<br />
int u2g(char *inbuf,int inlen,char *outbuf,int outlen)<br />
{<br />
return code_convert(&quot;utf-8&quot;,&quot;gb2312&quot;,inbuf,inlen,outbuf,outlen);<br />
}<br />
//GB2312码转为UNICODE码<br />
int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)<br />
{<br />
return code_convert(&quot;gb2312&quot;,&quot;utf-8&quot;,inbuf,inlen,outbuf,outlen);<br />
}<br />
<br />
例子2: 用C++语言实现的转换示例程序<br />
<br />
/* f.cpp : 代码转换示例C++程序 */<br />
#include &lt;iconv.h&gt;<br />
#include &lt;iostream&gt;<br />
<br />
#define OUTLEN 255<br />
<br />
using namespace std;<br />
<br />
// 代码转换操作类<br />
class CodeConverter {<br />
private:<br />
iconv_t cd;<br />
public:<br />
// 构造<br />
CodeConverter(const char *from_charset,const char *to_charset) {<br />
cd = iconv_open(to_charset,from_charset);<br />
}<br />
<br />
// 析构<br />
~CodeConverter() {<br />
iconv_close(cd);<br />
}<br />
<br />
// 转换输出<br />
int convert(char *inbuf,int inlen,char *outbuf,int outlen) {<br />
char **pin = &inbuf;<br />
char **pout = &outbuf;<br />
<br />
memset(outbuf,0,outlen);<br />
return iconv(cd,pin,(size_t *)&amp;inlen,pout,(size_t *)&amp;outlen);<br />
}<br />
};<br />
<br />
int main(int argc, char **argv)<br />
{<br />
char *in_utf8 = &quot;姝e?ㄥ??瑁?&quot;;<br />
char *in_gb2312 = &quot;正在安装&quot;;<br />
char out[OUTLEN];<br />
<br />
// utf-8--&gt;gb2312<br />
CodeConverter cc = CodeConverter(&quot;utf-8&quot;,&quot;gb2312&quot;);<br />
cc.convert(in_utf8,strlen(in_utf8),out,OUTLEN);<br />
cout &lt;&lt; &quot;utf-8--&gt;gb2312 in=&quot; &lt;&lt; in_utf8 &lt;&lt; &quot;,out=&quot; &lt;&lt; out &lt;&lt; endl;<br />
<br />
// gb2312--&gt;utf-8<br />
CodeConverter cc2 = CodeConverter(&quot;gb2312&quot;,&quot;utf-8&quot;);<br />
cc2.convert(in_gb2312,strlen(in_gb2312),out,OUTLEN);<br />
cout &lt;&lt; &quot;gb2312--&gt;utf-8 in=&quot; &lt;&lt; in_gb2312 &lt;&lt; &quot;,out=&quot; &lt;&lt; out &lt;&lt; endl;<br />
}<br />
<br />
<br />
二、利用iconv命令进行编码转换<br />
<br />
iconv命令用于转换指定文件的编码,默认输出到标准输出设备,亦可指定输出文件。<br />
<br />
用法: iconv [选项...] [文件...]<br />
<br />
有如下选项可用:<br />
<br />
输入/输出格式规范:<br />
-f, --from-code=名称 原始文本编码<br />
-t, --to-code=名称 输出编码<br />
<br />
信息:<br />
-l, --list 列举所有已知的字符集<br />
<br />
输出控制:<br />
-c 从输出中忽略无效的字符<br />
-o, --output=FILE 输出文件<br />
-s, --silent 关闭警告<br />
--verbose 打印进度信息<br />
<br />
-?, --help 给出该系统求助列表<br />
--usage 给出简要的用法信息<br />
-V, --version 打印程序版本号<br />
<br />
例子:<br />
iconv -f utf-8 -t gb2312 aaa.txt &gt;bbb.txt<br />
这个命令读取aaa.txt文件,从utf-8编码转换为gb2312编码,其输出定向到bbb.txt文件。
vfdff(作者)
2009-06-15 23:46
7
使用iconv进行内码转换(Big5-GB2312)<br />
<br />
使用iconv进行内码转换(Big5-GB2312)<br />
<br />
http://www.freebsd.org/ports/converters.html<br />
<br />
概述<br />
iconv是一个通过unicode作为中间码实现各种内码间相互转换的库,它基本上囊括了世界上所有编码方式,例如,ASCII、GB2312、 GBK、 GB18030、BIG5、UTF-8、UCS-2、UCS-2BE、UCS-2LE、UCS-4、UCS-4BE、UCS-4LE、UTF-16、 UTF-16BE、UTF-16LE、UTF-32、UTF-32BE、UTF-32LE、UTF-7等等等,除此之外,还包括泰语、日语、韩语、西欧等国家语言的编码。下面我们演示如何使用iconv实现Big5到GB2312的转换,当然只要简单修改一下便可实现iconv支持任何编码间的转换。<br />
<br />
下载<br />
libiconv是linux版本的iconv,可在 http://www.gnu.org/software/libiconv/ 下载<br />
iconv的win32版本可以在 http://gnuwin32.sourceforge.net/packages/libiconv.htm 下载<br />
<br />
SVN源码<br />
另外,还有一些演示代码,需要的可以到我的SVN下载<br />
http://xcyber.googlecode.com/svn/trunk/Convert/<br />
<br />
演示代码<br />
<br />
&nbsp;&nbsp;&nbsp;1. /****************************************************************************<br />
&nbsp;&nbsp;&nbsp;2. *&nbsp;&nbsp;&nbsp;Big5ToGB2312 - Convert Big5 encoding file to GB2312 encoding file<br />
&nbsp;&nbsp;&nbsp;3. *&nbsp;&nbsp;&nbsp;File:<br />
&nbsp;&nbsp;&nbsp;4. *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Big5ToGb2312.c<br />
&nbsp;&nbsp;&nbsp;5. *&nbsp;&nbsp;&nbsp;Description:<br />
&nbsp;&nbsp;&nbsp;6. *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Convert Big5 encoding file to GB2312 encoding file using iconv library<br />
&nbsp;&nbsp;&nbsp;7. *&nbsp;&nbsp;&nbsp;Author:<br />
&nbsp;&nbsp;&nbsp;8. *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XCyber&nbsp;&nbsp;&nbsp; email:XCyber@sohu.com<br />
&nbsp;&nbsp;&nbsp;9. *&nbsp;&nbsp;&nbsp;Date:<br />
&nbsp;&nbsp;10. *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;August 7, 2008<br />
&nbsp;&nbsp;11. *&nbsp;&nbsp;&nbsp;Other:<br />
&nbsp;&nbsp;12. *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit http://www.gnu.org/software/libiconv/ for more help of iconv<br />
&nbsp;&nbsp;13. ***************************************************************************/<br />
&nbsp;&nbsp;14.<br />
&nbsp;&nbsp;15.<br />
&nbsp;&nbsp;16. #include &lt;stdio.h&gt;<br />
&nbsp;&nbsp;17. #include &lt;stdlib.h&gt;<br />
&nbsp;&nbsp;18. #include &lt;tchar.h&gt;<br />
&nbsp;&nbsp;19. #include &lt;locale.h&gt;<br />
&nbsp;&nbsp;20. #include &quot;../iconv-1.9.2.win32/include/iconv.h&quot;<br />
&nbsp;&nbsp;21.<br />
&nbsp;&nbsp;22. //#pragma comment(lib, &quot;../iconv-1.9.2.win32/lib/iconv.lib&quot;)&nbsp;&nbsp;&nbsp;// using iconv dynamic-link lib, iconv.dll<br />
&nbsp;&nbsp;23. #pragma comment(lib, &quot;../iconv-1.9.2.win32/lib/iconv_a.lib&quot;)&nbsp;&nbsp;&nbsp;// using iconv static lib<br />
&nbsp;&nbsp;24.<br />
&nbsp;&nbsp;25. #define BUFFER_SIZE 1024&nbsp;&nbsp;&nbsp; //BUFFER_SIZE must &gt;= 2<br />
&nbsp;&nbsp;26.<br />
&nbsp;&nbsp;27.<br />
&nbsp;&nbsp;28. void usage()<br />
&nbsp;&nbsp;29. {<br />
&nbsp;&nbsp;30.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;\nBig5ToGB2312 - Convert Big5 encoding file to GB2312 encoding file\n&quot;);<br />
&nbsp;&nbsp;31.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;XCyber@sohu.com on August 7, 2008\n&quot;);<br />
&nbsp;&nbsp;32.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&nbsp;&nbsp;&nbsp;Usage:\n&quot;);<br />
&nbsp;&nbsp;33.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Big5ToGB2312 [Big5 file(in)]&nbsp;&nbsp;&nbsp;[GB2312 file(out)]\n\n&quot;);<br />
&nbsp;&nbsp;34. }<br />
&nbsp;&nbsp;35.<br />
&nbsp;&nbsp;36.<br />
&nbsp;&nbsp;37. int main(int argc, char* argv[])<br />
&nbsp;&nbsp;38. {<br />
&nbsp;&nbsp;39.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILE * pSrcFile = NULL;<br />
&nbsp;&nbsp;40.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILE * pDstFile = NULL;<br />
&nbsp;&nbsp;41.<br />
&nbsp;&nbsp;42.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char szSrcBuf[BUFFER_SIZE];<br />
&nbsp;&nbsp;43.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char szDstBuf[BUFFER_SIZE];<br />
&nbsp;&nbsp;44.<br />
&nbsp;&nbsp;45.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t nSrc&nbsp;&nbsp;&nbsp;= 0;<br />
&nbsp;&nbsp;46.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t nDst&nbsp;&nbsp;&nbsp;= 0;<br />
&nbsp;&nbsp;47.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t nRead = 0;<br />
&nbsp;&nbsp;48.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t nRet&nbsp;&nbsp;&nbsp;= 0;<br />
&nbsp;&nbsp;49.<br />
&nbsp;&nbsp;50.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *pSrcBuf = szSrcBuf;<br />
&nbsp;&nbsp;51.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *pDstBuf = szDstBuf;<br />
&nbsp;&nbsp;52.<br />
&nbsp;&nbsp;53.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iconv_t icv;<br />
&nbsp;&nbsp;54.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int argument = 1;<br />
&nbsp;&nbsp;55.<br />
&nbsp;&nbsp;56.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//check input arguments<br />
&nbsp;&nbsp;57.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(argc != 3)<br />
&nbsp;&nbsp;58.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;59.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; usage();<br />
&nbsp;&nbsp;60.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;<br />
&nbsp;&nbsp;61.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;62.<br />
&nbsp;&nbsp;63.<br />
&nbsp;&nbsp;64.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pSrcFile = fopen(argv[1],&quot;r&quot;);<br />
&nbsp;&nbsp;65.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(pSrcFile == NULL)<br />
&nbsp;&nbsp;66.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;67.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;can't open source file!\n&quot;);<br />
&nbsp;&nbsp;68.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;<br />
&nbsp;&nbsp;69.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;70.<br />
&nbsp;&nbsp;71.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDstFile = fopen(argv[2],&quot;w&quot;);<br />
&nbsp;&nbsp;72.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(pSrcFile == NULL)<br />
&nbsp;&nbsp;73.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;74.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;can't open destination file!\n&quot;);<br />
&nbsp;&nbsp;75.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;<br />
&nbsp;&nbsp;76.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;77.<br />
&nbsp;&nbsp;78.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//initialize iconv routine, perform conversion from BIG5 to GB2312<br />
&nbsp;&nbsp;79.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//TODO: if you want to perfom other type of coversion, e.g. GB2312-&gt;BIG5, GB2312-&gt;UTF-8 ...<br />
&nbsp;&nbsp;80.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//just change following two paremeters of iconv_open()<br />
&nbsp;&nbsp;81.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;icv = iconv_open(&quot;GB2312&quot;,&quot;BIG5&quot;);<br />
&nbsp;&nbsp;82.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(icv == 0)<br />
&nbsp;&nbsp;83.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;84.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;can't initalize iconv routine!\n&quot;);<br />
&nbsp;&nbsp;85.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;<br />
&nbsp;&nbsp;86.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;87.<br />
&nbsp;&nbsp;88.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//enable &quot;illegal sequence discard and continue&quot; feature, so that if met illeagal sequence,<br />
&nbsp;&nbsp;89.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//conversion will continue instead of being terminated<br />
&nbsp;&nbsp;90.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(iconvctl (icv ,ICONV_SET_DISCARD_ILSEQ,&amp;argument) != 0)<br />
&nbsp;&nbsp;91.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;92.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;can't enable \&quot;illegal sequence discard and continue\&quot; feature!\n&quot;);<br />
&nbsp;&nbsp;93.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;<br />
&nbsp;&nbsp;94.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;95.<br />
&nbsp;&nbsp;96.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(!feof(pSrcFile))<br />
&nbsp;&nbsp;97.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;98.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pSrcBuf = szSrcBuf;<br />
&nbsp;&nbsp;99.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDstBuf = szDstBuf;<br />
 100.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nDst = BUFFER_SIZE;<br />
 101.<br />
 102.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// read data from source file<br />
 103.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nRead = fread(szSrcBuf + nSrc,sizeof(char),BUFFER_SIZE - nSrc,pSrcFile);<br />
 104.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(nRead == 0)<br />
 105.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
 106.<br />
 107.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// the amount of data to be converted should include previous left data and current read data<br />
 108.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nSrc = nSrc + nRead;<br />
 109.<br />
 110.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//perform conversion<br />
 111.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nRet = iconv(icv,(const char**)&amp;pSrcBuf,&amp;nSrc,&amp;pDstBuf,&amp;nDst);<br />
 112.<br />
 113.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(nRet == -1)<br />
 114.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
 115.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // include all case of errno: E2BIG, EILSEQ, EINVAL<br />
 116.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E2BIG: There is not sufficient room at *outbuf.<br />
 117.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EILSEQ: An invalid multibyte sequence has been encountered in the input.<br />
 118.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EINVAL: An incomplete multibyte sequence has been encountered in the input<br />
 119.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // move the left data to the head of szSrcBuf in other to link it with the next data block<br />
 120.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memmove(szSrcBuf,pSrcBuf,nSrc);<br />
 121.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
 122.<br />
 123.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//wirte data to destination file<br />
 124.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fwrite(szDstBuf,sizeof(char),BUFFER_SIZE - nDst,pDstFile);<br />
 125.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
 126.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
 127.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iconv_close(icv);<br />
 128.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(pSrcFile);<br />
 129.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(pDstFile);<br />
 130.<br />
 131.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;conversion complete.\n&quot;);<br />
 132.<br />
 133.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
 134. }
vfdff(作者)
2009-06-18 21:23
8
B2312字符串转换为UTF-8的字符串,代码如下:<br />
#include &lt;stdio.h&gt;<br />
#include &lt;stdlib.h&gt;<br />
#include &lt;iconv.h&gt;<br />
<br />
<br />
int main(void)<br />
{<br />
&nbsp;&nbsp;&nbsp; unsigned char *src = &quot;魅影追击和歌姬&quot;; /* 需转换的字串 */<br />
&nbsp;&nbsp;&nbsp; unsigned char dst[256] = {0}; /* 转换后的内容 */<br />
&nbsp;&nbsp;&nbsp; unsigned char buf[1024] = {0}; /* 格式化转换后的字串 */<br />
&nbsp;&nbsp;&nbsp; size_t src_len = strlen(src);<br />
&nbsp;&nbsp;&nbsp; size_t dst_len = sizeof(dst);<br />
&nbsp;&nbsp;&nbsp; unsigned char *in = src;<br />
&nbsp;&nbsp;&nbsp; unsigned char *out = dst;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; iconv_t cd;<br />
&nbsp;&nbsp;&nbsp; int i;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; int j;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; cd = iconv_open(&quot;UTF-8&quot;, &quot;GB2312&quot;); /* 将GB2312字符集转换为UTF-8字符集 */<br />
&nbsp;&nbsp;&nbsp; if ((iconv_t)-1 == cd)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; printf(&quot;src: %s\n&quot;, src);<br />
&nbsp;&nbsp;&nbsp; iconv(cd, &amp;in, &amp;src_len, &amp;out, &amp;dst_len); /* 执行转换 */<br />
<br />
&nbsp;&nbsp;&nbsp; /* 以下将转换后的内容格式化为: %XX%XX...形式的字串 */<br />
&nbsp;&nbsp;&nbsp; printf(&quot;dst: &quot;);<br />
&nbsp;&nbsp;&nbsp; j = 0;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; strlen(dst); i++)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%.2X &quot;, dst[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[j++] = ''%'';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;snprintf(buf + j, 3, &quot;%.2X&quot;, dst[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j += 2; <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; printf(&quot;\n&quot;);<br />
&nbsp;&nbsp;&nbsp; printf(&quot;buf: %s\n&quot;, buf);<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; iconv_close(cd); /* 执行清理 */<br />
&nbsp;&nbsp;&nbsp; return 0;<br />
}<br />
 <br />
文章出处:http://www.diybl.com/course/3_program/vc/vc_js/2008114/96363.html
vfdff(作者)
2009-06-18 21:43
9
vs2008 编译iconvwww.diybl.com 时间:2009-05-04 作者:匿名 编辑:sky 点击: [评论]&nbsp;&nbsp;文章有错误,我要报错<br />
&nbsp;&nbsp;到论坛交流、讨论<br />
&nbsp;&nbsp;对该文章进行评论<br />
&nbsp;&nbsp;进入VIP视频站下载视频<br />
被过滤广告<br />
<br />
iconv是常用的一个字符集转换的开源库,主页在http://www.gnu.org/software/libiconv/<br />
<br />
1.11.1版本是最后一个支持MSVC编译的版本,1.12及之后的版本只支持MingW和Cygwin编译,下面是我用vs2008编译iconv的过程<br />
<br />
 <br />
<br />
1.下载1.11版本的libiconv<br />
<br />
2.在srclib/progname.h文件中添加一行:<br />
<br />
&nbsp;&nbsp;&nbsp;#define EXEEXT &quot;.exe&quot;<br />
<br />
3.将srclib/stdint_.h更名为srclib/stdint.h,并将'@'符号全部移除<br />
<br />
4.对srclib/Makefile.msvc进行以下改动:<br />
<br />
&nbsp;&nbsp;&nbsp; 1) 在OBJS=的定义中添加 width.obj<br />
<br />
&nbsp;&nbsp;&nbsp; 2) 添加如下定义:<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width.obj : width.c<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(CC) $(INCLUDES) $(CFLAGS) -c width.c<br />
<br />
5.调用以下命令编译DLL或LIB<br />
<br />
&nbsp;&nbsp;&nbsp;nmake -f Makefile.msvc NO_NLS=1 DLL=1 MFLAGS=-MD PREFIX=&quot;c:\lib_x86&quot; IIPREFIX=&quot;c:\lib_x86&quot;<br />
<br />
&nbsp;&nbsp;&nbsp;nmake -f Makefile.msvc NO_NLS=1 DLL=1 MFLAGS=-MD install PREFIX=&quot;c:\lib_x86&quot; IIPREFIX=&quot;c:\lib_x86&quot; <br />
<br />
&nbsp;&nbsp;&nbsp;或<br />
<br />
&nbsp;&nbsp;&nbsp;nmake -f Makefile.msvc NO_NLS=1 MFLAGS=-MD PREFIX=&quot;c:\slib_x86&quot; IIPREFIX=&quot;c:\slib_x86&quot;<br />
<br />
&nbsp;&nbsp;&nbsp;nmake -f Makefile.msvc NO_NLS=1 MFLAGS=-MD install PREFIX=&quot;c:\slib_x86&quot; IIPREFIX=&quot;c:\slib_x86&quot;<br />
<br />
&nbsp;&nbsp;&nbsp;PREFIX 和 IIPREFIX中的路径,必须用绝对路径<br />
<br />
6.编译完后,程序在.\lib_x86目录下<br />
<br />
 <br />
<br />
编译完成!<br />
<br />
文章出处:DIY部落(http://www.diybl.com/course/3_program/c++/cppjs/20090504/166564.html)
游客请输入验证码
浏览1943059次