WINDOWS 的记事本中有4种文本存储格式。  当要读取文本中的数据时,都是以字节来读取,当要把一个文本读取出来分到其它几个文本,读取双字节字符, 写入文本时就会出现乱码,
ANSI文本,则是开始,结尾的几个会乱码
其它格式的有可能后面几个子文本都是乱码
按照一般的做法,当读取的BUFF中最后一个字节大于127时 多读写一个字节以凑成双字节字符可是这种只在ANSI文本中有效,其它格式的文本还是会出现乱码。
要怎么样才通吃这几种文本?

解决方案 »

  1.   

    windows记事本保存的TXT文件是有标记的,头两个字节是FF FE表明是用UNICODE编码保存的。
    头三个字节是EF BB BF是用UTF-8保存的,否则为ANSI编码。你可以先读取文件的BOM,再确定怎么读取。
      

  2.   

    fp = _tfopen( name, _T( "rb" ) );
    if( fp )
    {
    fseek( fp, 0, SEEK_END );
    len = ftell( fp );
    fseek( fp, 0, SEEK_SET ); unsigned char *tmp = new unsigned char [ len + 64 ];
    if( !tmp )
    {
    if( IsChinese() )
    {
    ShowWarning( _T( "File_Mem 申请内容失败!" ) );
    }
    else
    {
    ShowWarning( _T( "File_Mem malloc memory failure!" ) );
    }
    return;
    }
    memset( tmp + len, 0, 64  );
    fread( tmp, 1, len, fp ); fclose( fp );
    if( 0xff == tmp[ 0 ] && 0xfe == tmp[ 1 ] )
    {
    //unicode下的unicode内容
    memcpy( buf, tmp + 2, len - 2 );
    buf[ ( ( len - 2 ) / 2 ) ] = 0;
    }
    else if( 0xfe == tmp[ 0 ] && 0xff == tmp[ 1 ] )
    {
    //unicode下的ucs2内容
    u2hex_ustr( ( unsigned char * )tmp + 2, len - 2, buf );
    }
    else if( 0xEF == tmp[ 0 ] && 0xBB == tmp[ 1 ] && 0xBF == tmp[ 2 ] )
    {
    //unicode下的utf8内容
    u8hex_ustr( ( unsigned char * )tmp + 3, len - 3, buf );
    }
    else
    {
    //unicode下读的ascii内容
    astr_ustr( ( char * )tmp, buf );
    }