使用ExtractFileName设置TListItem标题在U盘读取时乱码求助
问题分析与解决办法
问题根源
你遇到的乱码问题核心是ExtractFileName函数在U盘环境下的编码适配问题:
- 本地磁盘文件路径编码与系统默认编码一致,
ExtractFileName能正常处理; - U盘多采用FAT32格式,文件名编码可能和系统默认ANSI编码不兼容,若工程误调用ANSI版本的
ExtractFileNameA(而非Unicode版本ExtractFileNameW),会将Unicode文件名错误转码,最终导致乱码。
具体解决方法
方法1:强制调用Unicode版本的ExtractFileName
直接替换代码中的ExtractFileName为ExtractFileNameW,确保处理宽字符路径:
item->Caption = ExtractFileNameW(fileName.c_str());
方法2:手动实现文件名截取逻辑(彻底规避系统函数问题)
如果不想依赖系统函数,自行从路径中截取文件名更稳妥:
// 从后往前找路径分隔符(兼容\和/) int pos = fileName.LastDelimiter("\\/"); // 截取分隔符之后的部分作为文件名 UnicodeString fileNameOnly = fileName.SubString(pos + 1, fileName.Length() - pos); item->Caption = fileNameOnly;
验证建议
修改后在U盘环境测试,保留MessageBoxW代码对比截取前后的文件名,确认乱码是否消失。
内容的提问来源于stack exchange,提问作者OutOfTime
相关产品推荐
相关产品推荐

