none
mfc中如何读取,保存编码为utf-8的文件 RRS feed

  • 问题

  • 如题,我要用mfc开发一个小软件,主要功能就是读取编码为utf-8的文件,

    比如文件中有内容:

    subject=开心

    1=1.gif

    那么我就要把subject后面的内容开心获取下来,存为一个新的utf-8的文件,并在程序的文件夹下查找是否有1.gif这个图片存在

     

    我的开发工具是visual studio 2008

    读取ansi的文件比较容易,但是我一直搞不定编码为utf-8的文件

    问题:

    1.我是否需要在新建项目的时候使用Unicode字符集?

    2.如何读取和保存utf-8的文件?并获取其中某一段字符串(比如我刚才需要截取1.gif)

     

    希望高手提供一下代码或参考资料.

    第一次求助,十分感谢

    2009年1月5日 3:33

答案

  • 主要用到两个Api:
    MultiByteToWideChar
    http://msdn.microsoft.com/en-us/library/ms776413.aspx
    WideCharToMultiByte
    http://msdn.microsoft.com/en-us/library/ms776420.aspx

    ANSI <--> Unicode <--> UTF8

    /*代码如下*/
    Code Snippet
    wchar_t * ANSIToUnicode( const char* str )
    {
          int    textlen ;
          wchar_t * result;
          textlen = MultiByteToWideChar( CP_ACP, 0, str,-1,    NULL,0 );  
          result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));  
          memset(result,0,(textlen+1)*sizeof(wchar_t));  
          MultiByteToWideChar(CP_ACP, 0,str,-1,(LPWSTR)result,textlen );  
          return    result;  
    }

    char * UnicodeToANSI( const wchar_t *str )
    {
          char * result;
          int textlen;
          // wide char to multi char
          textlen = WideCharToMultiByte( CP_ACP,    0,    str,    -1,    NULL, 0, NULL, NULL );
          result =(char *)malloc((textlen+1)*sizeof(char));
          memset( result, 0, sizeof(char) * ( textlen + 1 ) );
          WideCharToMultiByte( CP_ACP, 0, str, -1, result, textlen, NULL, NULL );
          return result;
    }

    wchar_t * UTF8ToUnicode( const char* str )
    {
          int    textlen ;
          wchar_t * result;
          textlen = MultiByteToWideChar( CP_UTF8, 0, str,-1,    NULL,0 );  
          result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));  
          memset(result,0,(textlen+1)*sizeof(wchar_t));  
          MultiByteToWideChar(CP_UTF8, 0,str,-1,(LPWSTR)result,textlen );  
          return    result;  
    }

    char * UnicodeToUTF8( const wchar_t *str )
    {
          char * result;
          int textlen;
          // wide char to multi char
          textlen = WideCharToMultiByte( CP_UTF8,    0,    str,    -1,    NULL, 0, NULL, NULL );
          result =(char *)malloc((textlen+1)*sizeof(char));
          memset(result, 0, sizeof(char) * ( textlen + 1 ) );
          WideCharToMultiByte( CP_UTF8, 0, str, -1, result, textlen, NULL, NULL );
          return result;
    }

     

     

    2009年1月5日 4:44
    版主
  • 读取和保存就是二进制数据读写……
    2009年1月5日 6:35
    版主

全部回复

  •  

    UTF_8字符集
      UTF-8是UNICODE的一种变长字符编码,由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。如果UNICODE字符由2个字节表示,则编码成UTF-8很可能需要3个字节,而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。用4个或6个字节去编码一个UNICODE字符可能太多了,但很少会遇到那样的UNICODE字符。
      UFT-8转换表表示如下:
      UNICODE UTF-8
      00000000 - 0000007F 0xxxxxxx
      00000080 - 000007FF 110xxxxx 10xxxxxx
      00000800 - 0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
      00010000 - 001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
      00200000 - 03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 04000000 - 7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
      实际表示ASCII字符的UNICODE字符,将会编码成1个字节,并且UTF-8表示与ASCII字符表示是一样的。所有其他的UNCODE字符转化成UTF-8将需要至少2个字节。每个字节由一个换码序列开始。第一个字节由唯一的换码序列,由n位1加一位0组成。n位1表示字符编码所需的字节数。
      示例
      UNICODE uCA(11001010) 编码成UTF-8将需要2个字节:
      uCA -> C3 8A
      UNICODE uF03F (11110000 00111111) 编码成UTF-8将需要3个字节:
      u F03F -> EF 80 BF
    http://baike.baidu.com/view/25412.htm
    2009年1月5日 4:09
    版主
  • 用GNU提供的库,或者学习其实现。

    http://www.gnu.org/software/libiconv/

     

    Usually you convert from ANSI string to UTF-8 
     
    encoding in two steps: 
     
    1.  // ANSI -> UCS-2 
     
    MultiByteToWideChar(...) 
     
    2.  // UCS-2 -> UTF-8 
     
    WideCharToMultiByte(CP_UTF8, ...) 
    2009年1月5日 4:41
    版主
  • 主要用到两个Api:
    MultiByteToWideChar
    http://msdn.microsoft.com/en-us/library/ms776413.aspx
    WideCharToMultiByte
    http://msdn.microsoft.com/en-us/library/ms776420.aspx

    ANSI <--> Unicode <--> UTF8

    /*代码如下*/
    Code Snippet
    wchar_t * ANSIToUnicode( const char* str )
    {
          int    textlen ;
          wchar_t * result;
          textlen = MultiByteToWideChar( CP_ACP, 0, str,-1,    NULL,0 );  
          result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));  
          memset(result,0,(textlen+1)*sizeof(wchar_t));  
          MultiByteToWideChar(CP_ACP, 0,str,-1,(LPWSTR)result,textlen );  
          return    result;  
    }

    char * UnicodeToANSI( const wchar_t *str )
    {
          char * result;
          int textlen;
          // wide char to multi char
          textlen = WideCharToMultiByte( CP_ACP,    0,    str,    -1,    NULL, 0, NULL, NULL );
          result =(char *)malloc((textlen+1)*sizeof(char));
          memset( result, 0, sizeof(char) * ( textlen + 1 ) );
          WideCharToMultiByte( CP_ACP, 0, str, -1, result, textlen, NULL, NULL );
          return result;
    }

    wchar_t * UTF8ToUnicode( const char* str )
    {
          int    textlen ;
          wchar_t * result;
          textlen = MultiByteToWideChar( CP_UTF8, 0, str,-1,    NULL,0 );  
          result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));  
          memset(result,0,(textlen+1)*sizeof(wchar_t));  
          MultiByteToWideChar(CP_UTF8, 0,str,-1,(LPWSTR)result,textlen );  
          return    result;  
    }

    char * UnicodeToUTF8( const wchar_t *str )
    {
          char * result;
          int textlen;
          // wide char to multi char
          textlen = WideCharToMultiByte( CP_UTF8,    0,    str,    -1,    NULL, 0, NULL, NULL );
          result =(char *)malloc((textlen+1)*sizeof(char));
          memset(result, 0, sizeof(char) * ( textlen + 1 ) );
          WideCharToMultiByte( CP_UTF8, 0, str, -1, result, textlen, NULL, NULL );
          return result;
    }

     

     

    2009年1月5日 4:44
    版主
  • 只给出了转换的,但是还是没有给出读取和保存的...

    2009年1月5日 6:15
  • 读取和保存就是二进制数据读写……
    2009年1月5日 6:35
    版主