bash - 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,它可以工作。谢谢!
解决方案
在开箱即用的 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 上。)
推荐阅读
- java - 终端的 POST 请求中不支持 Spring Boot 内容类型“文本/纯文本”
- python - Python将GTFS时间转换为日期时间
- android - 使用 GestureDetectorCompat 的奇怪行为
- python - 从队列中获取消息时更新标签
- android - Android、Kotlin、ContentResolver:图像查看器无法识别我的应用发送的内容 uri
- c# - 为什么我不能在两个事件中调用表单对象?
- c# - 合并多个内容中的所有内容
div内的标签,变成单个字符串
- java - 如果我初始化一个已经在 JAVA 中初始化的 Class 对象会发生什么?
- terraform - 展平复合地图的输出内容
- python - Excel列数据需要转换成双引号括起来的值列表,然后通过排除开始括号写入json文件