常用网名: 猪头三
出生日期: 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