'。最好设定读取121为好。以免读取半个中文字。2)fge"og:type" content="webpage">'。最好设定读取121为好。以免读取半个中文字。2)fge" /> '。最好设定读取121为好。以免读取半个中文字。2)fge"> c中文显示乱码_教程_内存溢出

阅读 15

c中文显示乱码,第1张

提几个建议。1)没给出str的大小,不知道你定义的多大。至少str要保证120以上。考虑用2的倍数最优可以charstr[122]并且因为系统将自动在最后加'\0'。最好设定读取121为好。以免读取半个中文

字。2)fgets的用法问题。追加返回值的判断为好。if(fgets(str,120,fp)!=null){printf("%s\n",str)}3)关于出现乱码的问题,估计你的文件中有中文汉字。读取到119位的时候正好是某个汉字的前一半。要解决这个if(fgets(str,121,fp)!=null)这里120改成读偶数个121。另外文件最好用宽字符的。就可以避免乱码了。

这种情况多数是由于 *** 作系统的语言选项不正确引起的。建议你查看一下控制面板中的区域和语言选项,特别是有关“非Unicode程序的语言”,一定要选择成“中文(简体,中国)”。然后重启电脑。

这里涉及到一个字符在源代码(文本)中,编译好的二进制文件中,以及最后控制台输出编码形式的区别.

首先,要明确一点:C(语言/程序)并不理解ANSI,UTF-8以及任何其他编码.它只知道处理你给它的字符的二进制表示.

在简体中文Windows下,默认的文本保存编码是ANSI(即GBK)Linux下根据系统locale设定,一般应该是(zh_CN.UTF-8).(以下基于简体中文Windows)1)对于源文件中保存的"中文"这个字符串,VS2008看到的就是"0xd6d0"和"0xcec4"的形式(默认ANSI编码得到).但编译器

才不管是不是GBK神马的,它就管那串数字.

区别,MinGW看到的是"0xe4b8ad"和"0xe69687"(gcc默认UTF-8).注意,用MinGW编译的源文件中有中文宽字符必须保存为UTF-8编码.

2)然后,在二进制文件中的存储形式,对传统的字符串(char str[] = "中文"),编译器什么都不做,直接把那串数字(如"0xd6d0","0xcec4")搬过去塞进二进制文件.

但对于宽字符串(wchar_t wstr[] = L"中文"),编译器会将其做转换,转换成Unicode编码格式(在Windows是UTF-16,而Linux下是UTF-32).如"中文"的16位Unicode是"0x4e2d"和"0x6587",然后把这串转换后的数字("0x4e2d","0x6587")塞进二进制文件中.(这里VS和MinGW做的没有区别)


这里有点需要注意,编译器必须知道你的源文件保存的编码!如VS默认是ANSI编码,如果你用UTF-8保存.c源文件去用VS打开看一定是乱码.同理如果你用mingw编译ANSI编码保存的源文件,也会出错!(但可以修改编译选项解决,见文章末尾) 在本文这里这个原因其实很好理解,因为编译器需要知道,如果它要将一个保存在文件中的字符转成宽字符时,是从什么编码转到Unicode.(可见上述VS是GBK->Unicode,而MinGW是UTF-8->Unicode)

欢迎分享,转载请注明来源:

内存溢出

原文地址:

http://outofmemory.cn/tougao/11481324.html
你的
(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
大白菜官网 大白菜官网 一级用户组
flac3d导入table文件有什么格式要求吗
上一篇
2023-05-16
csp文件损坏了打不开怎么办
2023-05-16

发表评论
请登录后评论... 登录
提交

    评论列表(0条)
保存
{label} {label}