c语言文件读取汉字及汉字编码的问题

先贴程序
#define _CRT_SECURE_NO_WARNINGS

#include

using namespace std;
int main(void)
{
char ch;
FILE *f;
int i = 0;
int count = 0;
f = fopen("test.txt", "r+");
while ((ch = getc(f)) != EOF)

{

fseek(f, i, SEEK_SET);

putc(~ch, f);

i++;
fseek(f, i, SEEK_SET);

count++;
}
fclose(f);
printf("文件操作已经完成\n");
printf("共处理%d个字节\n", count);
printf("按任意键结束程序\n");
getchar();
return 0;
}

该程序实现的就是对文件内的字符进行取反,就是简单的加密,再取反一次就变回原样了,也就是解密
在对汉字进行操作的时候,我进行了一些字的实验,目前仅发现了一个王字,在取反后取反回去不能变成王字,我加了查看字符格式的代码,发现 王 这个字在进行第一次字符操作时候,被分解为三个字节!!!然后再操作,就变成了四个!进行一次加一次,但是其他的汉字目前没发现错误,不知道是怎么回事,难道王字的编码就是三个字节吗?
求大家解答一下,我是新人没有一个c币。。。如果以后我得到了,就追加给你,谢谢啦

3个回答

  • 简单来说,是汉字编码的问题。在Windows里,我们生成的txt文件最有可能是是GBK编码的。它的特点是每个汉字2个字节。没有例外。但是也有可能是Unicode用UTF-8来编码的,对于用Utf-8来编码的话,每个汉字就用3个字节来表示。另外,对文本文件文本,有可能会带上编码前缀,那样的话直接读取会多读到几个字节(其实就是前缀)
  • 以王字为例
  • 如果是GBK(或者GB2312),表示为CD F5
  • 如果以UTF-8,表示为E7 8E 8B
  • 如果是以Unicode表示,不带前缀为8B 73,带前缀为FF FE 8B 73
MR_D_j
JuniorWizard 非常感谢!!!
5 年多之前 回复
gamefinity
知常曰明 回复MR_D_j: 文本文件的编码,由集中可能决定。第一是有前缀的,由前缀决定;第二操作系统决定;第三是写文件的开发工具决定;第三是读写双方约定。
5 年多之前 回复
gamefinity
知常曰明 回复MR_D_j: ultraedit。写一个字到文本文件,用ultraedit打开,转到16进制模式
5 年多之前 回复
MR_D_j
JuniorWizard 回复知常曰明: 非常感谢你的回答,我大概明白了,不过我想自己再验证一些问题,能不能告诉我,怎么得知一个汉字的gbk编码?还有汉字以什么编码是由什么决定的??我用的编译环境也是vs2013,txt文件就是由系统的文本文档书写的
5 年多之前 回复
gamefinity
知常曰明 再次补充.这个程序虽短,里面涉及到的概念很多.首先,你是用fopen打开文件的,使用的mode是r+.r+是默认的文本方式读写文件,也就是说系统会自动将"回车"变成"回车"+"换行".联系到刚才所说的王的GBK编码是CD F5,也就是说在第二个F5写回的时候,实际上是写回了0D 0A两个字节.浴室指针一道第三个字节的时候,可以读到第三个字节是0A,于是你的问题就产生了.解决方式是把你的fopen的mode设置为ab+,这样会以二进制方式读取,就不会进行0D到0D 0A的转换了
5 年多之前 回复
gamefinity
知常曰明 我试了你的程序。你是读取一个字符然后把字符的补码写回原位置。这里面有个问题就是王字的GBK是 CD F5。CD的补码是0x32(也就是字符'2'),F5的补码是0x0D(也就是回车)因此我想你的问题可能出出在回车上。每次你把'王'重新写回你的test.txt的时候,请注意一下是不是多了一个回车,这个就是你的长度变化的原因。另你用的是什么文本编辑器来写回'王'字?我用vs2013的编辑器,做出来的结果除第一次是2后以后都是3,并不会出现4及以上.我估计是文本编辑器把不可见字符舍弃了的原因
5 年多之前 回复
MR_D_j
JuniorWizard 我试了试其他的字,显示都是只处理了两个字节,就这个王特殊
5 年多之前 回复

可能是存储格式问题,记事本默认的编码为ANSI

首先要看文件的编码格式,如果是GBK或者unicode编码,则汉字是2个字节存储,如果是UTF8,则是3个字节。

MR_D_j
JuniorWizard 我试了试其他的字,试了几十个,都是两个字节的,只有王特殊
5 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问