如何将UTF-8多字节char数组转为wchar_t,通过_wfopen()打开含中文路径文件
问题根因
Windows环境下标准库mbstowcs()默认使用系统当前ANSI代码页(简体中文系统默认为936)执行多字节到宽字符的转换,你拿到的char数组是UTF-8编码的路径,编码规则不匹配导致转换结果完全错误,最终_wfopen()拿到无效路径调用失败。
解决方案
方案1:使用Windows原生API MultiByteToWideChar(兼容性最佳,推荐)
显式指定UTF-8编码完成转换,不依赖全局环境配置,实现最稳定:
#include <windows.h> #include <stdio.h> #include <stdlib.h> FILE* open_utf8_file(const char* utf8_path, const wchar_t* open_mode) { // 计算转换所需的宽字符缓冲区长度 int wbuf_len = MultiByteToWideChar(CP_UTF8, 0, utf8_path, -1, NULL, 0); if (wbuf_len == 0) { // 可自行调用GetLastError()排查转换错误 return NULL; } wchar_t* wpath = (wchar_t*)malloc(wbuf_len * sizeof(wchar_t)); if (!wpath) { return NULL; } // 执行UTF-8到UTF-16的转换 MultiByteToWideChar(CP_UTF8, 0, utf8_path, -1, wpath, wbuf_len); FILE* fp = _wfopen(wpath, open_mode); free(wpath); return fp; } // 调用示例: // FILE* fp = open_utf8_file("C:\\F\\鸡汤é¥\\abstr.txt", L"r");
方案2:标准库方案,搭配区域配置
如果不想依赖Windows原生API,可通过修改全局区域编码让mbstowcs支持UTF-8转换:
#include <locale.h> #include <stdio.h> #include <stdlib.h> // 初始化时全局设置一次编码即可 setlocale(LC_ALL, ".UTF-8"); const char* utf8_path = "C:\\F\\鸡汤é¥\\abstr.txt"; wchar_t wpath[1024] = {0}; size_t converted_cnt = 0; mbstowcs_s(&converted_cnt, wpath, sizeof(wpath)/sizeof(wchar_t), utf8_path, _TRUNCATE); FILE* fp = _wfopen(wpath, L"r");
注意:该方案会修改进程全局的区域配置,可能影响其他模块的编码逻辑,使用前需确认影响范围。
方案3:高版本VS简化方案
如果使用Visual Studio 2019及以上版本,开启/utf-8编译选项后,可直接调用带UTF-8支持的fopen:
#include <stdio.h> #include <fcntl.h> // 全局设置文件操作默认使用UTF-8编码 _set_fmode(_O_U8TEXT); FILE* fp = fopen("C:\\F\\鸡汤é¥\\abstr.txt", "r");
验证方法
转换完成后可打印宽字符串内容,确认路径已正确显示为C:\F\鸡汤饭\abstr.txt后再执行文件打开操作,可快速定位转换环节是否存在问题。
内容的提问来源于stack exchange,提问作者Elmi
相关产品推荐
相关产品推荐

