使用tiny-process-library调用cURL上传含日文文件名文件Windows报错问题
问题原因
你遇到的是Windows平台下命令行参数编码的兼容性问题,核心原因有两个:
- 你传入的UTF-16格式命令行已经正确传递给了
CreateProcessW,但旧版本的Windows版curl默认以ANSI编码解析命令行参数,如果系统默认代码页不包含日文(比如简体中文系统默认代码页是936),日文字符就会被转成问号,导致curl找不到对应文件。 - macOS底层默认用UTF-8编码处理命令行参数,所以不会出现转码丢失的问题。
验证方法
你可以直接在PowerShell中手动执行对应curl命令,粘贴包含日文的完整文件路径:
curl "https://api.example.com/media/test.mp3?format=json" -T "C:/Users/bob/AppData/Local/Temp/ぁ.mp3"
如果同样报错找不到?.mp3,就证明问题出在curl本身的编码处理,和你对tiny-process-library的调用逻辑无关。
解决方案
方案1:升级curl版本
curl从7.78.0版本开始原生支持Windows平台的Unicode命令行参数,直接升级到官方最新的Windows版curl即可解决问题,不需要修改现有代码。
方案2:绕开命令行传文件名(兼容性最好)
修改curl命令,从标准输入读取上传内容,完全避开命令行编码问题:
- 把curl命令改成
curl "https://api.example.com/media/test.mp3?format=json" -T -,其中-T -代表从标准输入读取待上传的内容。 - 代码中打开对应的日文文件,把读取到的文件内容写入tiny-process-library创建的进程的标准输入即可。
方案3:启用系统UTF-8代码页(不推荐)
Windows 10 1703及以上版本可以在系统区域设置中开启"Beta版:使用Unicode UTF-8提供全球语言支持",开启后所有ANSI程序默认用UTF-8解析命令行参数,但会影响其他老旧软件的兼容性,不建议生产环境使用。
内容的提问来源于stack exchange,提问作者easysaesch
相关产品推荐
相关产品推荐

