哪位大侠帮帮忙!我用的多字节编码模式,用char*型 保存打开不同编码文件(UNICODE,UTF-8)中的字符串

C++语言 码拜 10年前 (2015-05-11) 1006次浏览 0个评论
 

来混分数的人勿扰!
用的多字节编码模式(不是unicode)模式,用char*型 (不用TCHAR)保存输入的字符串,汉字由两个位于(-96,-2)之间的码表示,实际是转换成他的补码来表示,那么问题来了。
我要打开一个 unicode文件 或者utf文件,用char* 型 来读取保存从文件中获取的字符,这里怎么做 才能正确读取不乱吗并且完整读取??附上部分代码:我这里打开任意asci编码文件毫无问题,打开UTF文件指示汉字乱码,unicode则完全读不出来。

 bool OpenFile()
    {
      FILE *fp;
      fp = fopen(FileName, "r");
      if(fp == 0) 
	return false;
        int CurPos, FileSize; 
  CurPos = ftell(Fp);   //获得当前位置相对于文件首的位移,该位移值等于文件所含字节数。
  fseek(Fp, 0L, SEEK_END); // 首先将文件的当前位置移到文件的末尾
  FileSize = ftell(Fp);  //获得当前位置相对于文件首的位移,该位移值等于文件所含字节数。
  fseek(Fp, CurPos, SEEK_SET); 

  while(BufferSize < FileSize)
    InFlate(); //扩从缓存
  int i = 0;
  while((*(Str + i++) = getc(Fp)) != EOF);
  Length = i-1;

      fclose(fp);
      SetScrollBar(m_hWnd);
      InvalidateRect(m_hWnd, NULL, false);
      return true;
    }
试过 wfstream 吗?
引用 1 楼 ri_aje 的回复:

试过 wfstream 吗?

我这里程序读写文件没问题的,跟wfstream 没关系,读取asci格式的文件 和utf文件  没问题,utf汉字乱码而已,我想问的是 读取unicode文件 怎么判别,怎么转码?

fp = fopen(FileName, “rb“);

不要把
fopen(“…”,”…”);fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen(“…”,”…b”);fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了

可以具体吗?给个例子号码?谢谢了,另外 我读 unicode和utf-8两种文件都是这样读吗?谢谢了
怎么处理utf8,这个可以google到的。
unicode,有bom可以根据bom判断,没有bom但是有英文可以自己根据\0的情况进行判断。
剩下的就是自己google,然后反复验证各网页的说法了。
读完拿libiconv系列函数转换下编码吧..
不过也有天然乱码的情况,比如用GB码保存的”伪尾纬未蔚味畏胃喂魏位渭谓”,可以很好的用utf8格式识别成希腊字母
引用 5 楼 taodm 的回复:

怎么处理utf8,这个可以google到的。
unicode,有bom可以根据bom判断,没有bom但是有英文可以自己根据\0的情况进行判断。
剩下的就是自己google,然后反复验证各网页的说法了。

怎么知道他有bom还是没有bom?

引用 6 楼 sugar13 的回复:

读完拿libiconv系列函数转换下编码吧..
不过也有天然乱码的情况,比如用GB码保存的”伪尾纬未蔚味畏胃喂魏位渭谓”,可以很好的用utf8格式识别成希腊字母

小弟是菜鸟,可以详细点吗?

60分
用这个方式可以把UTF8编码转换成GB码,当然如果文件比较大,要注意控制缓冲区,一段一段转换..

iconv_t gb_cd = iconv_open ("GB18030", "UTF-8");
iconv (gb_cd, &utf8_buf, &utf8_len, &gb_buf, &gb_len);
iconv_close (gb_cd);


把”UTF-8″换成如下的unicode编码,就可以实现unicode转化成GB码
“UCS-2”, “UCS-2BE”, “UCS-2LE”,
“UCS-4”, “UCS-4BE”, “UCS-4LE” ,
“UTF-16”, “UTF-16BE”, “UTF-16LE”,
“UTF-32”, “UTF-32BE”, “UTF-32LE”,
注意这个编码格式是用字符串表示的.

然后就是尝试把原文分别当做上述编码进行转换,转换过程中可能会发生错误,检测到错误可以用来否定对应的编码类型.
你可以决定一个顺序,首先尝试哪个格式,然后尝试哪个格式,最先无错误转换过去的编码,当做原文的编码.至于所有格式都有错误,那就决定一个缺省格式…剔除串中的非法字符…

不过在windows下玩libiconv库,光是先把这个库添到工程里面,就是一件麻烦事啊
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明哪位大侠帮帮忙!我用的多字节编码模式,用char*型 保存打开不同编码文件(UNICODE,UTF-8)中的字符串
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!