C++实现文件保存为ANSI/UTF-8/UCS-2文件
题记: 有时候 统一与规范可以解决很多问题。
曾经使用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文件相关推荐
- java建立新文件保存数据_关于java中创建文件,并且写入内容
packagecom.file.run;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;im ...
- python下载文件保存_python 3.3 下载固定链接文件并保存的方法
python 3.3 下载固定链接文件并保存. import urllib.request print ("downloading with urllib") url = 'htt ...
- 微信公众号录音文件保存到自己开发的服务器(amr文件转mp3)
音频转码工具,主要用于将微信语音 amr 格式转换为 mp3 格式以便在 html5 的 audio 标签中进行播放 1.调用微信提供的接口获取录音的InputStream字节流 public Inp ...
- matlab命名文件保存在哪里,用Matlab给整个文件夹下的文件分别重命名
从读硕士以来一直用"期刊名字+年份+论文名字"的方式来给所有PDF文档命名,后来发现其实把年份放在前面会更好,一方面对于年份的记忆其实比期刊名字更强烈,在搜寻一篇论文时总是先想到年 ...
- C++第15周(春)项目2 - 用文件保存的学生名单
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759.内有完整教学方案及资源链接 本程序中须要的相关文件.请到http://pa ...
- 谷歌浏览器下载的文件保存在哪里?
许多人在使用谷歌浏览器上网时都会下载一些好看的电影.电视.小说或可玩性较高的游戏,但在完成下载后,却不清楚自己下载的东西放在了哪里!这不禁令人更好奇,谷歌浏览器下载的文件保存在哪里?下面让我们来了解一 ...
- 单文件图片管理php,php封装的单文件(图片)上传类完整实例
本文实例讲述了php封装的单文件(图片)上传类.分享给大家供大家参考,具体如下: //封装php中的单文件(图片)上传类 /* //参数1:$file 文件数组 5个属性值 name,type,siz ...
- 怎么让文件、资料变的更安全?文件加密和系统设置很重要
想要让电脑文件安全,有很多种办法,最简单的就是加密软件. 1.加密软件,如Windows自带的Bitlocker.7-zip.VeraCrypt等等,它们在加密方面安全性都很棒,但最好的还是VeraC ...
- 在FastReport2.8中打开frf文件,选择另存为fr3文件,这时FastReport4是不能打开该文件的。按下述步骤调整:
在FastReport2.8中打开frf文件,选择另存为fr3文件,这时FastReport4是不能打开该文件的.按下述步骤调整: 使用记事本打开该fr3文件. 1.将所有 Tfr 替换为Tfrx ...
最新文章
- Linux5-bash基础特性之命令历史
- 一次zabbix的渗透
- 漫画:什么是八皇后问题
- 《Reids 设计与实现》第六章 数据库
- Java实现可视化迷宫
- layui 树状图默认全部展开_SolidWorks 钣金展开基础设定
- IIS 搭建简单网站 并 发布项目
- word排版技巧:如何撤销删除自动编号
- Swift游戏实战-跑酷熊猫 04 熊猫的跳和滚的动作
- 如何打开损坏的PDF文件查看内容并修复
- 小蓝本 第一本《因式分解技巧》第四章 拆项与添项 笔记(第四天)
- foxmail 不知道这样的主机
- excel调用python编程-超简单:用Python让Excel飞起
- 企业进行固定资产盘点的作用
- win10停止更新_你的win10即将终止!各大版本服务终止日期大全,准备好了吗?...
- matlab脚本文件求梯度,转:用MATLAB求梯度的二个实例
- #计算机应用与技巧分享 #应用推荐 #录屏 Captura 免费开源的屏幕录制工具
- Navicat如何连接阿里云数据库RDS
- thinkcmf需要的php版本,升级指导 · ThinkCMF5开发手册 · 看云
- 一个正经的前端学习 开源 仓库(阶段十七-440)
热门文章
- html中引入的js无效果,为什么javascript不起作用?
- 独立团、驿站、团店,2023粮油产品社区团购的新爆点?
- Lucene入门及实际项目应用场景
- SaoMl二开带app最新版
- linux找不到convert,convert命令_convert不是内部或外部命令的问题
- 2019高考,高考语文作文试题
- 下载迅雷,绑定了好多软件,让人困扰
- 我常用的firefox几款插件
- 秋招面试 前端问题总结
- After Effects Guru: Integrating Type into Video Volume 2 After Effects 大师教程之如何集成文字到视频中(卷2) Lynda课程中