如何安全将Windows UTF-16路径转为ANSI路径适配TensorFlow C API?
解决Windows下TensorFlow C API加载含非ANSI字符路径的问题
核心问题分析
直接将UTF-16(WCHAR)路径转换为ANSI(char*)是不可行的——ANSI编码依赖系统代码页,无法覆盖所有Unicode字符(比如不在当前代码页的中文、特殊符号等),转换时会丢失信息导致路径无效。
正确解决方案:转UTF-8编码的char*
TensorFlow C API在Windows环境下支持UTF-8编码的路径字符串(尽管参数类型是char*),因此正确的做法是将UTF-16路径转换为UTF-8格式的char*,而非ANSI。
代码实现
替换原有的路径转换逻辑,使用WideCharToMultiByte函数完成UTF-16到UTF-8的转换:
// 获取当前路径到WCHAR数组,然后追加'/model' WCHAR curpath[MAX_PATH]; GetCurrentDirectory(MAX_PATH, curpath); PathCombineW(this->model_path, curpath, TEXT("model")); // 转换UTF-16路径到UTF-8的char* // 第一步:计算所需的UTF-8缓冲区大小 int utf8_size = WideCharToMultiByte( CP_UTF8, // 指定转换为UTF-8 0, // 无特殊转换标志 this->model_path, // 源UTF-16字符串 -1, // 自动计算源字符串长度(包含终止符) nullptr, // 临时传空,获取所需大小 0, // 缓冲区大小为0,仅计算所需空间 nullptr, nullptr // 默认替换字符,无需使用 ); if (utf8_size == 0) { // 处理转换失败的情况,可调用GetLastError()获取错误码 return; // 或其他错误处理逻辑 } // 第二步:分配UTF-8缓冲区 char* mb_path = (char*)malloc(utf8_size); if (!mb_path) { // 内存分配失败处理 return; } // 第三步:执行转换 WideCharToMultiByte( CP_UTF8, 0, this->model_path, -1, mb_path, utf8_size, nullptr, nullptr ); // 调用TensorFlow API TF_LoadSessionFromSavedModel(sessionOpts, runOpts, mb_path, &tags, ntags, this->graph, nullptr, status); // 使用完后释放内存 free(mb_path);
关键说明
WideCharToMultiByte指定CP_UTF8编码时,能完整保留所有Unicode字符的信息,不会出现丢失或乱码。- 转换时先调用一次函数获取所需缓冲区大小,避免内存不足或浪费。
- 务必在使用完
mb_path后调用free释放内存,防止内存泄漏。
内容的提问来源于stack exchange,提问作者November
相关产品推荐
相关产品推荐

