ANSI与UNICODE文本的问题 WINDOWS 的记事本中有4种文本存储格式。 当要读取文本中的数据时,都是以字节来读取,当要把一个文本读取出来分到其它几个文本,读取双字节字符, 写入文本时就会出现乱码,ANSI文本,则是开始,结尾的几个会乱码其它格式的有可能后面几个子文本都是乱码按照一般的做法,当读取的BUFF中最后一个字节大于127时 多读写一个字节以凑成双字节字符可是这种只在ANSI文本中有效,其它格式的文本还是会出现乱码。要怎么样才通吃这几种文本? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 windows记事本保存的TXT文件是有标记的,头两个字节是FF FE表明是用UNICODE编码保存的。头三个字节是EF BB BF是用UTF-8保存的,否则为ANSI编码。你可以先读取文件的BOM,再确定怎么读取。 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 ); } VC调用DLL过程中出现的问题 无法解析的外部命令 vc6bug?在对话框应用程序里,创建的CFrameWnd和对话框上的activex冲突,vc7正常 怎么在进程外部设置errormode? 如何去掉视图的Client Edge风格? 怎样随意截取显示在客户区里的图像,并保存成Jpg或Gif或Bmp格式!谢谢 请教一个MFC自动生成代码的问题 关于智能指针的问题 一个很简单的问题关于spin的用法. 关于一个免费域名申请的问题 请问:setsocket和ioctlsocket的区别 UINT类型怎么转换为CString
头三个字节是EF BB BF是用UTF-8保存的,否则为ANSI编码。你可以先读取文件的BOM,再确定怎么读取。
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 );
}