首页 > 解决方案 > MacOS Bash 脚本 - 带有日文字符的转义字符串

问题描述

我尝试使用该printf %q技巧将转义序列添加到 shell 脚本中的日语文件名:

printf '%q\n'  "Toru Watanabe - 約束 ( 1982 )"

但结果是这样的:

$'Toru Watanabe - ?\204?\235\237 ( 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=

解决方案:根据 Tripleee 的建议,我从源代码构建了 bash 5.0,它可以工作。谢谢!

标签: bashmacosshell

解决方案


在开箱即用的 MacOS(Bash 3.2.57(1)-release)上,无论语言环境如何,我都会得到与您报告的相同的输出。

在新的 Ubuntu Docker(Ubuntu 20.04 - Bash 5.0.17(1)-release)中,我仍然得到

$'Toru Watanabe - \347\264\204\346\235\237 ( 1982 )'

使用默认的 POSIX 语言环境。安装并激活de_DE.UTF-8语言环境后,我得到了预期的输出。

# printf '%q\n'  "Toru Watanabe - \347\264\204\346\235\237 ( 1982 )"
$'Toru Watanabe - \347\264\204\346\235\237 ( 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 '%q\n'  "Toru Watanabe - \347\346 ( 1982 )"
Toru\ Watanabe\ -\ 約束\ \(\ 1982\ \)

所以我得出结论,这既依赖于语言环境,也依赖于版本。

不过,我确实相信这只是一个审美问题。在某种意义上,八进制转义码比原始汉字字符更好、更健壮,因为只有当系统正确设置为 UTF-8 时,这些转义码才会起作用。(但在当今时代,这也许是一个合理的假设,只要您不在 Windows 上。)


推荐阅读