有没有办法在它的 shebang 中注释 bash 的编码?



我写了一个类似下面的bash,它在Linux终端中反响很好,因为我用UTF-8编码了文件:

#!/bin/bash
echo 'Olá, möndo!'

我被要求让用户选择他们认为合适的任何编码,同时仍然在终端中打印正确的变音符号,但由于终端默认为UTF-8,任何其他编码都会产生各种奇怪的字符。

所以,问题是:用户应该如何在文件中注释bash的编码?bash有让我们这样做的模式吗?


我知道file -I几乎正确地检测到文件的编码,但有问题的bashes是以./foo.sh的常规方式执行的。因此,如果终端能够自己检测编码,那就太好了。

它的工作方式正好相反。您的脚本知道用户希望在其来自区域设置LC_MESSAGES的消息中使用的编码,因此您的脚本应该相应地输出该编码中的文本。它不是终端检测你的脚本,而是你的脚本为不同的编码提供消息的翻译。LC_MESSAGES应该也有编码信息,所以LC_MESSAGES=en_US.UTF-8不是LC_MESSAGESen_US.EBCDIC

提供翻译的通常方式是通过gettext。Bash提供了内置的gettext支持(但它仍然需要大量工作才能使其可用(,并支持$"..."字符串,请参阅语言环境翻译。

对于更普通的解决方案,可以使用iconv进行动态转换。假设您可以从用户的区域设置中将用户的首选编码提取到$enc中,那么只需

echo 'Olá, möndo!' | iconv -f utf-8 -t "$enc"

最新更新