You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将对话框文本与日期写入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:55:13