Windows环境下拼接变量生成的归档文件名被追加U+25AA字符是什么原因
问题原因分析
U+25AA是符号▪对应的Unicode编码,Windows环境下运行tar命令出现该字符被追加到文件名末尾的问题,通常由以下几个原因导致:
- 变量本身携带隐形字符:你传入的
output_file变量在定义、读取的环节就已经附带了不可见控制字符,常见场景包括从富文本编辑器、Word文档、带格式的终端输出内容里直接复制变量值,或是从带BOM的UTF-8编码、Windows格式换行的配置文件中读取变量,这类隐形字符在变量打印时不会显示,拼接文件名时就会暴露出来。 - 跨环境字符编码转换异常:如果你是在WSL、Git Bash、Cygwin这类Windows上的类Unix模拟环境中运行tar命令,Windows和类Unix系统的换行符、编码规则差异会引发转换异常:比如Windows原生的换行符是
\r\n,如果变量从Windows格式的脚本中读取时末尾的\r没有被过滤,部分Shell会把无法正常识别的\r转换为U+25AA符号作为占位显示。 - PowerShell编码兼容问题:如果你直接在PowerShell中调用Windows原生的tar.exe工具,PowerShell默认使用UTF-16LE编码存储变量,变量内容传递给tar命令时如果没有完成正确转码,部分不可打印的编码段会被转换为U+25AA这类占位符号追加到文件名末尾。
快速排查方案
你可以直接查看变量的原始编码确认问题:
- 类Unix模拟环境下运行命令:
echo $output_file | cat -A - PowerShell环境下运行命令:
$output_file | Format-Hex
确认存在多余字符后,只需要在拼接文件名前对变量做一次特殊字符过滤即可,比如PowerShell环境可以用$output_file = $output_file -replace '[^\w\.\-\/]',''清理所有非预期的特殊字符。
内容的提问来源于stack exchange,提问作者rmaitipe
相关产品推荐
相关产品推荐

