我写了一个类似下面的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"