如何将对话框文本与日期写入UTF-8格式文件?
如何将文件输出编码从Windows 1252改为UTF-8?
你的现有代码依赖ANSI字符集的API和文件操作逻辑,导致输出文件采用Windows 1252编码。要切换为UTF-8编码,需从文本获取、编码转换、文件写入三个环节调整,具体方案如下:
1. 改用宽字符API获取控件文本
Windows对话框控件默认以UTF-16(Unicode)格式存储文本,直接调用宽字符版本API可避免ANSI编码的转换损失:
wchar_t input_w[65536]; // 调用宽字符版本的GetDlgItemTextW GetDlgItemTextW(hDlg, IDC_INPUTEDIT, input_w, sizeof(input_w)/sizeof(wchar_t));
2. 将宽字符转换为UTF-8编码
使用WideCharToMultiByte函数,把UTF-16编码的宽字符串转换为UTF-8编码的多字节字符串:
char input_utf8[65536 * 4]; // UTF-8每个字符最多占4字节,预留足够空间 // 转换为UTF-8编码 int utf8_len = WideCharToMultiByte(CP_UTF8, 0, input_w, -1, input_utf8, sizeof(input_utf8), NULL, NULL); if (utf8_len == 0) { // 处理转换失败逻辑,比如弹出错误提示 MessageBoxW(hDlg, L"字符串转UTF-8失败", L"错误", MB_OK); return; }
日期生成部分无需修改,%Y-%m-%d的输出为ASCII字符,天然兼容UTF-8:
char date[11]; strftime(date, 11, "%Y-%m-%d", tm_info);
3. 写入UTF-8编码的文件
以二进制模式打开文件,直接写入转换后的UTF-8内容(避免文本模式自动转换换行符):
FILE *f = fopen("test.txt", "ab"); if (f == NULL) { MessageBoxW(hDlg, L"无法打开文件", L"错误", MB_OK); return; } // 可选:写入UTF-8 BOM(\xEF\xBB\xBF),部分编辑器需要它识别UTF-8编码 // fwrite("\xEF\xBB\xBF", 1, 3, f); // 写入日期和UTF-8文本 fprintf(f, "%s %s\n", date, input_utf8); fclose(f);
关键补充
- 若项目已定义
UNICODE宏,GetDlgItemText会自动映射为GetDlgItemTextW,直接用wchar_t存储输入即可。 - 二进制模式打开文件(
"ab")可防止Windows文本模式将\n转为\r\n,若需保留Windows风格换行,可改用文本模式"a",但二进制模式更安全。 - UTF-8 BOM为可选内容,不需要的话可省略,不影响UTF-8编码的有效性。
内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

