Windows系统内置tar工具处理含特殊字符路径的问题咨询
Windows系统内置tar工具处理含特殊字符路径的问题咨询
我最近在Windows 10命令行里遇到一个棘手的问题:用系统自带的tar工具创建或读取归档文件时,如果归档文件本身的路径包含特殊字符(具体是Unicode码点255以上的字符,比如扩展拉丁字符及更高阶字符),就会出现各种异常。这里要特别强调:问题只出在归档文件自身的路径上,归档包内的文件都是普通ASCII路径,完全正常。
顺带说明下,Windows 10自带的这个tar其实是来自libarchive的bsdtar,路径是c:\Windows\System32\tar.exe。
给大家举几个实际测试的例子:
- 执行命令
tar -c -f Ā.tar foo,结果生成的归档文件是A.tar,而非预期的Ā.tar - 如果事先已经存在一个
Ā.tar文件,执行tar -t -f Ā.tar会直接报错:
tar: Error opening archive: Failed to open 'A.tar'
- 要是用像Δ这种更高阶的字符,执行
tar -c -f Δ.tar foo直接彻底失败,报错:
tar: Failed to open '?.tar'
我现在想请教大家:这个问题的原因可能是什么?有没有修复方法或者可行的替代方案?
另外我也做了不少测试,整理了一些观察到的现象:
- 这个问题在cmd、PowerShell、git-bash里都能复现(bash里我是明确调用
c:\Windows\System32\tar.exe测试的) - 换成Git for Windows自带的GNU tar,在这三个终端里都不会出现这个问题
- 我在Ubuntu Linux上安装libarchive-tools后用bsdtar测试,也没遇到同样的问题
- 顺带提一下,如果归档包内的文件路径有码点255以上的字符,哪怕用PAX格式也会出类似问题,而且GNU tar也存在这个情况
- 我尝试过修改命令行代码页,默认是437,改成UTF-8(
chcp 65001)后,问题依然存在 - 甚至不是所有437代码页里的字符都能正常工作
- 其他程序比如
notepad Δ.txt处理同样的特殊字符完全没问题,没有任何异常
我自己平时习惯用纯ASCII路径,但这个问题在一些场景下会变得很关键——比如用户的Windows用户名里有特殊字符,这些字符会出现在%USERPROFILE%路径里,这时用系统tar工具就会出问题。
我也查了一些可能相关的内容,比如libarchive的几个相关issue(#587、#1629),还有关于UTF-8代码页65001是否在不同机器上存在差异的讨论,但还没找到明确的解决方案。
备注:内容来源于stack exchange,提问作者djvg
相关产品推荐
相关产品推荐

