我尝试使用printf %q
技巧将转义序列添加到shell脚本中的日语文件名:
printf '%qn' "Toru Watanabe - 約束 ( 1982 )"
但结果是:
$'Toru Watanabe - ?204?235237 ( 1982 )'
有没有在shell脚本中添加转义序列但保持这些字符不变的技巧?
编辑:区域设置信息
LANG="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_CTYPE="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_ALL=
解决方案:根据Triplee的建议,我从源代码构建了bash 5.0,它很有效。非常感谢。
在MacOS开箱即用(Bash 3.2.57(1(-发行版(上,无论语言环境如何,我都会得到与您报告的输出相同的输出。
在一个新的Ubuntu Docker(Ubuntu 20.04-Bash 5.0.17(1(-版本(中,我仍然得到
$'Toru Watanabe - 347264204346235237 ( 1982 )'
使用默认的POSIX语言环境。在安装并激活de_DE.UTF-8
语言环境之后,我得到了预期的输出。
# printf '%qn' "Toru Watanabe - 347264204346235237 ( 1982 )"
$'Toru Watanabe - 347264204346235237 ( 1982 )'
# apt-get update; apt-get install -y locales; dpkg-reconfigure locales
# # (... select de_DE.UTF-8 to be generated and installed as the default)
# export LC_ALL=de_DE.UTF-8
# printf '%qn' "Toru Watanabe - 347346 ( 1982 )"
Toru Watanabe - 約束 ( 1982 )
因此,我得出的结论是,这既依赖于区域设置,也依赖于版本。
不过,我确实认为这只是一个审美问题。从某种意义上说,八进制转义码比原始汉字字符更好、更健壮,因为只有系统正确设置为UTF-8,这些转义码才能工作。(但在这个时代,只要你不在Windows上,这也许是一个合理的假设。(