题记: 有时候 统一与规范可以解决很多问题。

曾经使用C++进行文件操作一直困惑我,为什么中文就乱码了呢?为什么在NotePad++上能够正常显示,然而在NotePad上显示行号就乱了呢?

解决上述问题,和题记相呼应,统一编码格式就能够解决所有的困惑。NotePad++支持多种编码,NotePad作为小弟自然比不上,现在让我一一介绍实现小弟支持的编码格式 ANSI, Unicode, Unicode big endian, UTF-8。

  • 保存为ANSI编码文件
  • 保存为UTF-8编码文件
  • 保存为Unicode编码文件
  • 加好友一起学习

保存为ANSI编码文件

ANSI 的”Ascii”编码(American Standard Code for Information Interchange,美国信息互换标准代码)。

#include <iostream>
#include <fstream>
#include <locale>
using namespace std;int main()
{// setlocale(LC_ALL, "zh_CN.UTF-8");// std::locale::global(std::locale("chs"));wstring content = L"[我是中国人! I'm a Chinese!我是中国人!";wofstream ofs("save_as_ansi.txt", ios::ate);ofs.write(content.c_str(), content.size());ofs.close();return 0;
}

OK,运行上面代码,你兴高彩烈打开“save_as_ansi.txt”,What!怎么只有一个 [ 可见,其实别慌,只需要反注释内容就正常显示了。

setlocale
头文件:locale.h
char* setlocale(int category, const char* locale)

设置所有C语言与本地环境相关的C函数的locale。当你傻傻分不清或不愿意去查到底哪些函数,在C++代码里加上它,就能解决潜在的问题。

std::locale::global:

头文件:locale
声 明:static locale global( const locale& loc );

替换全局 C++ 与本地环境相关的函数的locale, 返回系统原先的locale。

保存为UTF-8编码文件

实际上utf-8编码文件还可以分为包含BOM和无BOM两种文件,区分就在文件头。

实现它很麻烦,自从有了C11之后就很简单了,但是请不要在MAC OS7及其以下使用,因为系统根本不支持C11。你只能采用平台object-c的API实现了。

UTF-8 With Bom

#include <iostream>
#include <fstream>
#include <codecvt>
#include <locale>
using namespace std;int main()
{wstring content = L"[我是中国人! I'm a Chinese!我是中国人!";wofstream ofs("save_as_utf_8_bom.txt", ios::ate);ofs.imbue(std::locale(ofs.getloc(), new std::codecvt_utf8<wchar_t, 0x10ffff, std::generate_header>));ofs << content;ofs.close();return 0;
}

UTF-8 Without Bom

#include <iostream>
#include <fstream>
#include <codecvt>
#include <locale>
using namespace std;int main()
{wstring content = L"[我是中国人! I'm a Chinese!我是中国人!";wofstream ofs("save_as_utf_8_no_bom.txt", ios::ate);ofs.imbue(std::locale(ofs.getloc(), new std::codecvt_utf8<wchar_t, 0x10ffff, std::little_endian>));ofs << content;ofs.close();return 0;
}

区别仅在codecvt_utf8模板参数最后一位。

保存为Unicode编码文件

UCS-2 大端

#include <iostream>
#include <fstream>
#include <codecvt>
#include <locale>
using namespace std;int main()
{wstring content = L"[我是中国人! I'm a Chinese!我是中国人!";wofstream ofs("save_as_ucs2_big.txt", ios::ate);ofs.imbue(std::locale(ofs.getloc(), new std::codecvt_utf16<wchar_t, 0x10ffff, std::generate_header>));ofs << content;ofs.close();return 0;
}

按照前面的思路,实现就很简单了,C11为你做好了,请看 std::codecvt_utf16

UCS-2 小端

#include <iostream>
#include <fstream>
#include <codecvt>
#include <locale>
using namespace std;int main()
{wstring content = L"[我是中国人! I'm a Chinese!我是中国人!";wofstream ofs("save_as_ucs2_little.txt", ios::ate);ofs.imbue(std::locale(ofs.getloc(), new std::codecvt_utf16<wchar_t, 0x10ffff, (std::codecvt_mode)3>));ofs << content;ofs.close();return 0;
}

注意小端的模式掩码变为1|2,即:

enum codecvt_mode {consume_header = 4,generate_header = 2,little_endian = 1
};

尾语:我对C++的技能要求是能够熟练运用就好了。如果你要做语言编码库,或者更加底层的开发,那么请尽量阅读官方文档。以前是做C++开发,现在Python是我的主战场,做一名优秀的Pyhton开发者,朝着高级系统架构师发展。

加好友一起学习

如果你和我一样热爱开发,请加为好友,一起学习吧。如果你是单身女性开发者,加好友认识呗!。

C++实现文件保存为ANSI/UTF-8/UCS-2文件相关推荐

  1. java建立新文件保存数据_关于java中创建文件,并且写入内容

    packagecom.file.run;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;im ...

  2. python下载文件保存_python 3.3 下载固定链接文件并保存的方法

    python 3.3 下载固定链接文件并保存. import urllib.request print ("downloading with urllib") url = 'htt ...

  3. 微信公众号录音文件保存到自己开发的服务器(amr文件转mp3)

    音频转码工具,主要用于将微信语音 amr 格式转换为 mp3 格式以便在 html5 的 audio 标签中进行播放 1.调用微信提供的接口获取录音的InputStream字节流 public Inp ...

  4. matlab命名文件保存在哪里,用Matlab给整个文件夹下的文件分别重命名

    从读硕士以来一直用"期刊名字+年份+论文名字"的方式来给所有PDF文档命名,后来发现其实把年份放在前面会更好,一方面对于年份的记忆其实比期刊名字更强烈,在搜寻一篇论文时总是先想到年 ...

  5. C++第15周(春)项目2 - 用文件保存的学生名单

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759.内有完整教学方案及资源链接 本程序中须要的相关文件.请到http://pa ...

  6. 谷歌浏览器下载的文件保存在哪里?

    许多人在使用谷歌浏览器上网时都会下载一些好看的电影.电视.小说或可玩性较高的游戏,但在完成下载后,却不清楚自己下载的东西放在了哪里!这不禁令人更好奇,谷歌浏览器下载的文件保存在哪里?下面让我们来了解一 ...

  7. 单文件图片管理php,php封装的单文件(图片)上传类完整实例

    本文实例讲述了php封装的单文件(图片)上传类.分享给大家供大家参考,具体如下: //封装php中的单文件(图片)上传类 /* //参数1:$file 文件数组 5个属性值 name,type,siz ...

  8. 怎么让文件、资料变的更安全?文件加密和系统设置很重要

    想要让电脑文件安全,有很多种办法,最简单的就是加密软件. 1.加密软件,如Windows自带的Bitlocker.7-zip.VeraCrypt等等,它们在加密方面安全性都很棒,但最好的还是VeraC ...

  9. 在FastReport2.8中打开frf文件,选择另存为fr3文件,这时FastReport4是不能打开该文件的。按下述步骤调整:

    在FastReport2.8中打开frf文件,选择另存为fr3文件,这时FastReport4是不能打开该文件的.按下述步骤调整:  使用记事本打开该fr3文件. 1.将所有 Tfr  替换为Tfrx ...

最新文章

  1. Linux5-bash基础特性之命令历史
  2. 一次zabbix的渗透
  3. 漫画:什么是八皇后问题
  4. 《Reids 设计与实现》第六章 数据库
  5. Java实现可视化迷宫
  6. layui 树状图默认全部展开_SolidWorks 钣金展开基础设定
  7. IIS 搭建简单网站 并 发布项目
  8. word排版技巧:如何撤销删除自动编号
  9. Swift游戏实战-跑酷熊猫 04 熊猫的跳和滚的动作
  10. 如何打开损坏的PDF文件查看内容并修复
  11. 小蓝本 第一本《因式分解技巧》第四章 拆项与添项 笔记(第四天)
  12. foxmail 不知道这样的主机
  13. excel调用python编程-超简单:用Python让Excel飞起
  14. 企业进行固定资产盘点的作用
  15. win10停止更新_你的win10即将终止!各大版本服务终止日期大全,准备好了吗?...
  16. matlab脚本文件求梯度,转:用MATLAB求梯度的二个实例
  17. #计算机应用与技巧分享 #应用推荐 #录屏 Captura 免费开源的屏幕录制工具
  18. Navicat如何连接阿里云数据库RDS
  19. thinkcmf需要的php版本,升级指导 · ThinkCMF5开发手册 · 看云
  20. 一个正经的前端学习 开源 仓库(阶段十七-440)

热门文章

  1. html中引入的js无效果,为什么javascript不起作用?
  2. 独立团、驿站、团店,2023粮油产品社区团购的新爆点?
  3. Lucene入门及实际项目应用场景
  4. SaoMl二开带app最新版
  5. linux找不到convert,convert命令_convert不是内部或外部命令的问题
  6. 2019高考,高考语文作文试题
  7. 下载迅雷,绑定了好多软件,让人困扰
  8. 我常用的firefox几款插件
  9. 秋招面试 前端问题总结
  10. After Effects Guru: Integrating Type into Video Volume 2 After Effects 大师教程之如何集成文字到视频中(卷2) Lynda课程中