fread函数读含有中文字符的文件时出现乱码

sglu128 2012-04-23 10:54:05
我的问题如标题所述,我的示例代码如下:

#include <stdio.h>

int main(int argc, char **argv)
{
FILE *fp = fopen("/home/android.txt", "r");
char tmp[256] = {0};
int byte = 0;

if (!fp)
{
return -1;
}

if ((byte = fread(tmp, sizeof(char), 256, fp)))
{
printf("len=%d, data:%s\n", byte, tmp);
}
fclose(fp);

return 0;
}

android.txt文件(Unicode编码,ANSI编码也是如此)内容如下:
android

Android是一种以Linux为基础的开放源码操作系统,主要使用于便携设备。目前尚未有统一中
文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,
最初主要支持手机。2005年由Google收购注资,并组建开放手机联盟开发改良,逐渐扩展到平
板电脑及其他领域上。Android的主要竞争对手是苹果公司的iOS以及RIM的Blackberry OS。
2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2012年2月数
据,Android占据全球智能手机操作系统市场52.5%的份额,中国市场占有率为68.4%。

测试结果如下:
len=256, data:android

AndroidˇһזӔLinuxΪ»ᶄ¿ª·Ɣ´ë²ڗﶍ³£¬׷ҪʹԃԚ±䐯ʨ±¸¡£ĿǰʐδԐͳһא
τϳƣ¬א¹䂽µه�ɋʹԃ¡°°²׿¡±»ᰰ²ׂ¡±¡£Android²ڗﶍ³خ³䈁ndy Rubin¿ª·¢£¬
خ³縒ª֧³׊ֻᰰ05ŪԉGoogle˕¹ºע؊£¬²¢ة½¨¿ª·Ɗֻ넋¿ª·¢¸Ł¼£¬ᄃ


我分别试过Unicode编码和ANSI编码的“android.txt”文件,可在读取中文的时候,输出的还是乱码。
在此想请问下大家,出现乱码的这种情况是因为什么原因引起的?谁能为我解答一下,谢谢各位了。



...全文
2079 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-04-24
  • 打赏
  • 举报
回复
不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了
赵4老师 2012-04-24
  • 打赏
  • 举报
回复
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。
推荐使用WinHex软件查看文件或内存中的原始字节内容。
疯疯癫癫 2012-04-24
  • 打赏
  • 举报
回复
楼主的代码,我这里运行后正常啊。。。。。。。
baichi4141 2012-04-24
  • 打赏
  • 举报
回复
简单地说,将文字显示给楼主看的时候没有找到对应的字符集所以显示为乱码
sglu128 2012-04-24
  • 打赏
  • 举报
回复
我刚才又试了一下,发现如果把读出来的乱码给另写到一个文件当中的时候,就不会出现这种乱码问题。我个人分析出现这种问题的原因可能是在Linux下当打印输出中文字符的时候,printf函数并没有对非utf-8的字符串进行自动转换因此才会出现这种乱码的。
caiyunl 2012-04-23
  • 打赏
  • 举报
回复
我这里没问题。。
格式
1.txt: UTF-8 Unicode text
qq120848369 2012-04-23
  • 打赏
  • 举报
回复
linux还是windows?

linux则把文件转化成utf-8格式,
windows则把文件转化成gbk格式。

就都没有问题了。
hen_hao_ji 2012-04-23
  • 打赏
  • 举报
回复
if ((byte = fread(tmp, sizeof(char), 255, fp)))

改成读 255喽,最后一位要为 '\0'

70,014

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧