代码

#include <iostream>
#include <fstream>
#include <locale>using namespace std;int main()
{setlocale(LC_ALL, "chs");    // 设置字符编码环境char buf;int x;wchar_t y, temp;ifstream is("D:\\存档\\OneDrive\\桌面\\作业\\测试文档.docx", ios::in);while(is.eof() == false){is.read(&buf,sizeof(buf));if(int(buf) < 0){y = 0x0000;y = buf;  // 取第一个字节的后4位y <<= 6;    // 为下一个字节的六位准备空间 is.read(&buf,sizeof(buf));// 取第二个字节的后六位temp = buf;temp = temp & (63);    // 取出temp的后六位y |= temp;y <<= 6; // 为下一个字节的六位准备空间is.read(&buf, sizeof(buf));temp = buf;temp = temp & (63);y |= temp;printf("%S", &y);continue;}else{y = buf;printf("%s", &y);}}cout << endl;is.close();return 0;
}

运行结果

原理解释

在解决这个问题之前,我们需要先熟悉一下utf-8编码,大多数人认为中文在utf-8编码
里只占两个字节,其实这么表述是有问题的,真正的utf-8编码中,中文占据三个字节,
只不过只有两个字节是用来表示是哪个汉字的而已,具体详见下面这位大佬的文章

大佬文章

从上面的文章和这张图可以知道,ascii 表里面有的字符用的是第一种一个字节的编码方式,
而汉字用的是第三种编码方式,所以如果文档中只包含字符和汉字这两种字符的话,只需要
分类处理这两种情况就行了,而从图中可以发现中文编码和其他字符的不同之处:其他编码(只包含ascii里的字符)的字节都是以0开头的中文编码的三个字节都是从1开始的
所以,先将一个字节的内容读出来,之后将这个字节强转成为有符号数 int 类型,那么就会
出现所有的中文字符都是负数,所有的非中文字符都是正数,所以,对于强转之后是正数的
情况,直接输出就可以了,对于强转之后是负数的情况,就读取三个字节,之后将1号字节的
后四位取出来,2号字节的后六位取出来,3号字节的后六位取出来,并且将这些取出来的
二进制位重新拼接成为一个16位的字符,之后输出的就是汉字了,如果想要将汉字重新写回
文档并且不发生乱码的话,只需要将是汉字的部分重新构造成上面图中的三个字节编码的格式
写回文档就可以了

另外

这份代码里面的第一行代码是用来设置字符编码环境的
wchar_t 是宽字符,占据16位二进制位,定义原型是 typedef short wchar_t;
sprintf(%S, ..) 中的大S是专门用来输出宽字符的输出格式,这个格式必须在设置完编码格式之后才有效
c++的移位运算是算数移位
10进制的63是 0011 1111,只是c++里面不允许直接使用二进制值,所以我将这串二进制转换成为了十进制

如何解决c++文件读写流无法读取中文的问题(vc6.0)相关推荐

  1. 网络编程(part2)--文件读写之打开/读取/写入

    鄙人学习笔记 文章目录 文件读写 打开文件 举个例子1(以读方式打开) 举个例子2(以写方式打开) 读取文件 read 举个例子1 readline 举个例子2(继续用例子1的note.txt文件) ...

  2. C语言文件读写读汉字,读取汉字库中的汉字

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 一般在屏幕上显示汉字的时候需要汉字系统的支持,但需要自己显示汉字的时候,就需要自己读汉字字库文件,把字符点阵读出来,再用绘图的办法显示到屏幕上,本文是读  ...

  3. java流与文件——对象流和序列化

    [0]README 0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件--对象流和序列化 的相关知识: 0.2) for source code , pleas ...

  4. 章节十六:编码和文件读写

    章节十六:编码和文件读写 目录 章节十六:编码和文件读写 1. 编码 1.1 二进制 1.2 编码表 1.3 encode()和decode() 2. 文件读写 2.1 读取文件 2.2 写入文件 2 ...

  5. C# FileStream类:文件读写

    在 C# 语言中文件读写流使用 FileStream 类来表示,FileStream 类主要用于文件的读写,不仅能读写普通的文本文件,还可以读取图像文件.声音文件等不同格式的文件. 在创建 FileS ...

  6. seek是python文件操作方法吗,seek引发的python文件读写的问题

    我的需求很简单,就是统计一下我的安装脚本执行的次数和时间,格式是这样的 install_times:1|install_times:2018-09-03 15:58:46 install_times: ...

  7. python 写csv加锁_Python: 对CSV文件读写 和 Md5加密

    1. python 有专门的csv包,直接导入即可. import csv: 2. 直接使用普通文件的open方法 csv_reader=open("e:/python/csv_data/l ...

  8. java properties读取中文_Java读取properties文件中文乱码

    Java读取properties文件中文乱码 之前读取properties配置文件时候全都是英文或者数字之类的,最近项目有个需求要properties配置文件中有中文字符存在,那么读取java pro ...

  9. C#InI文件读写剖析

    C#InI文件读写剖析 1.读取ini文件 StringBuilder stringBuilder = new StringBuilder();GetPrivateProfileString(sect ...

最新文章

  1. 1151 LCA in a Binary Tree (含求LCA的通法)
  2. JetBrains DataGrip工具配置数据库过程详解
  3. JspServlet
  4. bat for循环_bat教程[279] reg import命令的用法
  5. android edittext seterror,EditText之setError方法一二
  6. Effective C++学习第二天
  7. 东方智慧和西方智慧的比较
  8. Ubuntu12.04 搭建TFTP服务
  9. 如何评价,为何程序员被骂立马就辞职呢?
  10. UVa 10286 - Trouble with a Pentagon
  11. 计算机毕业设计asp.net学院网站系统VS开发sqlserver数据库web结构c#编程计算机网页源码项目
  12. matlab曲线拟合幅频特性曲线_频域稳定性与matlab指令计算
  13. H3CNE、H3CSE认证考试亲身奋斗过程的心得(拿出来晒晒)
  14. Java编程思想笔记
  15. MAC 中selenium、webdriver打开Chrome浏览器闪退问题(版本号一致)
  16. R数据分析:随机截距交叉滞后RI-CLPM与传统交叉滞后CLPM
  17. Kibana KQL查询语法
  18. APP使用monkey进行稳定性测试过程
  19. 一天 第一章 花在花苞未有泪,人见不识无言对
  20. soso地图api接口地理解析geocoder检索示例----并在信息框显示经纬度

热门文章

  1. 淘宝 登录 3步登录 取得cookie的方式
  2. shell脚本进制转换
  3. Python3.6新特性(部分)
  4. 运维初学者必备之SRS音视频服务器搭建
  5. Delphi快速开发本机跨平台Google Maps谷歌地理信息系统GIS解决方案
  6. ❤️导图整理数组4: 三数之和 相比于 两数之和 的难点, 力扣15❤️
  7. 欧盟的数据保护政策对美国的商贸意味着什么?
  8. Java面试锦囊(四)
  9. DES With Perl
  10. 昆仑万维或将引领国内 AIGC 技术发展