MacOS Bash脚本-包含日语字符的转义字符串



我尝试使用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上,这也许是一个合理的假设。(

最新更新