[原创](Modern C++)现代C++的关键性概念: 文件编码细节之三:正确使用 std::ifstream与std::ofstream进行文件ANSI, UTF-8, UTF16编码处理

常用网名: 猪头三
出生日期: 1981.XX.XX
企鹅交流: 643439947
个人网站: 80x86汇编小站
编程生涯: 2001年~至今[共24年]
职业生涯: 22年
开发语言: C/C++、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python
开发工具: Visual Studio、Delphi、XCode、Eclipse、C++ Builder
技能种类: 逆向 驱动 磁盘 文件
研发领域: Windows应用软件安全/Windows系统内核安全/Windows系统磁盘数据安全/macOS应用软件安全
项目经历: 磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测

[序言]
在实际开发中, 文件编码问题始终是不可忽视的关键性细节. 特别是在Windows平台上, 常见的编码方式有本地编码(通常为ANSI, 如 GB18030、GBK)、UTF-8以及UTF-16 LE. 不同编码方式之间的相互转换往往伴随着BOM(字节顺序标识)的处理、字符串的null结尾问题以及跨平台兼容性等诸多挑战. 本文将通过一系列示例代码, 演示如何使用现代C++提供的输入输出流(std::ifstream与std::ofstream以二进制方式操作文件, 确保在写入和读取过程中正确地处理各种编码格式. 示例代码涵盖了:

* 利用std::string保存ANSI文件
* 利用std::u8string或转换为std::string写入UTF-8文件
* 利用std::wstring写入UTF-16 LE文件, 并添加BOM标识
* 针对UTF-8与UTF-16文件的读取操作, 解决BOM检测、文件末尾null终止符补全等问题

[代码演示]
注意: 由于示例代码中涉及Windows平台特定的接口(如_setmode、_fileno等), 因此代码主要在Windows环境下测试运行.

int main()
{

	// 注意: 如下代码演示仅在Windows平台下测试, 本人不考虑跨平台操作.

	// 1> std::string(ANSI)以ANSI(本地代码页)的方式保存到目标文件.
	// 注意打开包含有中文的ANSI文件, 最好选择GB18030代码, 因为它比GBK更好, 而GBK比BG2312好.
	std::string str_Demo = "Hello World 你好 世界";
	std::ofstream ofs_ansi(LR"(C:\Users\Win_AI\Desktop\SAVE_ANSI.txt)", std::ios::binary);
	ofs_ansi.write(str_Demo.c_str(), str_Demo.size());
	ofs_ansi.close();

	// 2> std::string(utf8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不是代码教父

我的创作动力离不开你的真诚激励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值