【发布时间】:2015-02-23 11:45:44
【问题描述】:
有几种特定于 shell 的方法可以在字符串中包含“unicode 文字”。例如,在 Bash 中,引用的字符串扩展机制 $'' 允许我们直接嵌入一个不可见字符:$'\u2620'。
但是,如果您尝试编写通用的跨平台 shell 脚本(通常,这可以被截断为“在 Bash、Zsh 和 Dash 中运行”),这不是一个可移植的功能。
我可以使用如下结构轻松实现 ASCII 表(八进制数空间)中的任何内容:
WHAT_A_CHARACTER="$(printf '\036')"
...然而,POSIX / Dash printf 仅支持八进制转义。
显然,我还可以通过将任务分配给更完整的编程环境来实现完整的 Unicode 空间:
OH_CAPTAIN_MY_CAPTAIN="$(ruby -e 'print "\u2388"')"
TAKE_ME_OUT_TONIGHT="$(node -e 'console.log("\u266C")')"
那么:将这样的字符编码为 shell 脚本的最佳方法是什么:
- 在
dash、bash和zsh中工作, - 显示代码中代码点的十六进制编码,
- 不依赖于字符串的特定编码(即不通过以八进制编码 UTF-8 字节)
- 最后,不需要调用任何“重型”解释器。 (比方说,少于 0.01 秒的运行时间。)
【问题讨论】:
-
如果没有 2,您当然可以在脚本源中逐字显示您的角色,例如,
printf '⎈♬\n'。如果你有一个不错的编辑器,将光标放在它上面应该会显示代码;你也应该可以输入它(例如,Ctrl+Shift+u 2388)。我不明白为什么 2 真的是个问题。 -
@gniourf_gniourf 2 的问题基本上是它需要一个像样的编辑器。在很多情况下,我希望那些没有那么奢侈的人可以访问我的源代码。具有对程序功能至关重要的特殊字符以可访问的方式编码,从而为更大的贡献者群体打开了源代码的开发。这不是总是(甚至经常!)的问题,但有时值得考虑。 ;)
-
@gniourf_gniourf(有很多情况,即使是在 2015 年,逐字 Unicode 编码的文档会被假设为简单的 ASCII 或 ISO-8859-1 的管道破坏。这是一个可悲的事实。)跨度>
-
这是一个很好的问题,我同意你关于包含裸字形的观点。但是: - #2 有点自我冗余:这是您指定的输入格式,因此如果您将一个十六进制代码放在那里,它只会显示一个十六进制代码。代码点只是与字形相关联的 32 位整数,而十六进制 U+09AF 格式只是一种约定。 en.wikipedia.org/wiki/Unicode#Architecture_and_terminology - 第三个是荒谬的。您必须对字符串进行编码以某种方式;正如您已经提到的,POSIX
printf只允许八进制转义。因此,使用语言环境 UTF-8,这是唯一的方法。 -
(3) 背后的原理是什么?
标签: bash shell unicode posix dash-shell