在 Windows 10 命令行中,tar
在存档本身的路径中创建带有“特殊”字符(例如扩展拉丁字符)的存档会导致错误。
更准确地说,快速示例表明,Unicode 代码点 255 以上的字符似乎失败了。也就是说拉丁语扩展-A以上。
注意:这是关于 tar 档案本身的路径。档案库中文件(又名成员)都有“简单”的 ASCII 路径。
注意:开箱即用的 Windows 10包括 bsdtar从库存档, 位于c:\Windows\System32\tar.exe
。
例如,tar -c -f Ā.tar foo
创建一个名为A.tar
,而不是 的档案Ā.tar
。
类似地,如果我有一个名为的现有档案Ā.tar
,则会tar -t -f Ā.tar
产生
tar:打开存档时出错:无法打开“A.tar”
并且类似的事情tar -c -f Δ.tar foo
完全失败了
tar:无法打开“?.tar”
问题:可能是什么原因造成的?有没有什么解决办法或解决方法?
一些观察:
- 该问题已重现于命令,电源外壳,以及(git-)狂欢
c:\Windows\System32\tar.exe
(在 bash 中明确调用) - 问题确实不是使用 GNU tar 出现,与 git-for-windows 捆绑在一起(也在 cmd、powershell 和 bash 中测试过)
- 问题确实不是在 Ubuntu Linux 上出现(
bsdtar
安装后调用libarchive-tools
) - 如果
tar
成员即使使用 PAX 格式,路径中也有代码点 255 以上的字符(这似乎也扩展到 GNU tar) - 默认代码页是437,但改变代码页,例如
chcp 65001
,没有什么区别 - 此外,代码页 437 中的字符似乎也并不全都有效
- 其他程序使用相同的“特殊”字符也可以正常工作,例如
notepad Δ.txt
我个人始终坚持使用 ASCII 路径,但如果人们在 Windows 用户名中使用特殊字符,则此问题就会变得重要。这些字符最终会变成%USERPROFILE%
。
可能相关:
- 库存档#587,第 1629 章,...
- UTF-8 代码页标识符 (65001) 在其他计算机上会有所不同吗?
- ...
答案1
该问题在错误报告中被提及 路径中含有 Unicode 字符?#6。
该漏洞报告本身可追溯到 2015 年,但 Bodigrim 直到 2023 年 12 月 22 日才宣布:
Unicode 文件名现在应该可以使用了,之后aa683b0。我将 TarPath 切换为 PosixString;由于它没有暴露,所以这不是一个重大变化。
Windows 的tar.exe
发布日期为 2023 年 11 月,因此尚无法包含此修复程序,而且尚不清楚它何时会进入 Windows。
我建议近期避免使用 Windows 版本,或者避免使用包含非 ASCII 字符的路径。