【问题标题】:Is there a way to annotate a bash's encoding in its shebang?有没有办法在其 shebang 中注释 bash 的编码?
【发布时间】:2021-03-26 18:59:38
【问题描述】:

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

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

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

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


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

【问题讨论】:

  • 反之亦然。您的脚本从语言环境知道终端的编码,因此它应该输出采用该编码的文本。不是终端检测你的脚本,是你的脚本提供不同编码的翻译。
  • 我认为您首先需要问的问题是:当用户指定编码时,什么程序会将输出转换为正确的输出编码(以及,就此而言,这将如何程序知道正确的输出编码是什么?)找到答案,并将其构建到脚本中的方式可能会自行回答。
  • 我明白了。有时我无法让他们更改应用程序中的设置,但我可以鼓励他们至少将编码写入文件。

标签: linux bash encoding utf-8 terminal


【解决方案1】:

反之亦然。您的脚本知道用户希望在来自语言环境LC_MESSAGES 的消息中使用的编码,因此您的脚本应该相应地输出采用该编码的文本。它不是终端检测您的脚本,您的脚本是否为不同编码提供其消息的翻译。 LC_MESSAGES应该也有编码信息,所以LC_MESSAGES=en_US.UTF-8不是LC_MESSAGESen_US.EBCDIC

提供翻译的常用方式是通过gettext。 Bash 带有内置的gettext 支持(但它仍然需要大量 工作才能使其可用)及其$"..." 字符串支持,请参阅locale translations

【讨论】:

  • 这完全解决了问题:#!/usr/bin/env LC_ALL=en_US.ISO-8859-1 bash 并且用户通常都知道他们正在编写的编码。我愿意这样做。你知道我不应该这样做的原因吗?
  • @GugaCoder 这不会解决它,因为终端期望/理解的编码可能与脚本的编码不同,这对它们之间的翻译没有任何作用。但它甚至比这更糟糕,因为用于文件名的编码可能与脚本和/或终端的不同,如果您需要与文件中的文本内容进行交互,那可能又会有所不同......而且每次都是文本从这些上下文之一移动到不同的上下文,您可能需要一个显式翻译步骤。
  • 我明白了其中的含义。我编辑我的问题以反映您的想法。它似乎有效,所以我将进一步调查,所以会发生什么。
  • 你说得对,我看到各种奇怪的事情发生了。
  • 或者,您可以让人们添加一个标准化格式的注释作为脚本的第二行(例如#Charset: ISO-8859-1),然后自己编写一个转换器脚本,该脚本将读取该注释并翻译将脚本写入 您的 首选字符集(并调整注释以匹配)。
【解决方案2】:

对于更简单的解决方案,您可以使用iconv 进行即时转换。假设您可以将用户的首选编码从他们的语言环境设置中提取到$enc,那么只需

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

【讨论】:

    猜你喜欢
    • 2013-07-11
    • 2012-04-14
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    相关资源
    最近更新 更多