【问题标题】:How do I change a shell scripts character encoding?如何更改 shell 脚本字符编码?
【发布时间】:2023-04-11 00:30:01
【问题描述】:

我正在使用Gina Trapiani's excellent todo.sh 来组织我的待办事项列表。

不过,作为一个丹麦人,如果脚本接受特殊的丹麦字符,如 ø 和 æ,那就太好了。

我是一个绝对的 UNIX-n00b,所以如果有人能告诉我如何解决这个问题,那将是一个很大的帮助! :)

【问题讨论】:

  • 我已经在 Mac OS X 上成功地使用了带有扩展字符的todo.sh。你使用的是哪个平台?

标签: unix shell character-encoding


【解决方案1】:

Unix 世界正在慢慢地从 ASCII 和其他区域编码转向 UTF-8。您需要运行 UTF 终端,例如现代 xterm 或 putty。

在您的 ~/.bash_profile 中将您的语言设置为 UTF-8 变体之一。

export LANG=C.UTF-8
or
export LANG=en_AU.UTF-8
etc..

然后您应该能够在终端中编写 UTF-8 字符,并将它们包含在 bash 脚本中。

#!/bin/bash
echo "UTF-8 is græat ☺"

另请参阅:https://serverfault.com/questions/11015/utf-8-and-shell-scripts

【讨论】:

  • 在 TTY(不是 xterm)上,在运行 unicode_start 之前,终端可能不支持 UTF-8。 (这与语言环境和 shell/应用程序支持无关。)一些发行版在启动时启用此功能,但有些则没有。
  • 与OP的问题无关,但只是为了记录而发布。这解决了我在使用 ipdb 调试 Python 脚本时遇到的问题。每次我尝试打印变量时,它都会返回*** UnicodeEncodeError: 'ascii' codec can't encode character '\u22f1' in position 314: ordinal not in range(12)。我尝试设置LANG=en_US.UTF-8,但只有设置为export LANG=C.UTF-8才有效。
  • 我来到这里正是为了 ipdb 问题,但是虽然我能够正确打印这个:echo "UTF-8 is græat ☺",但我仍然在 ipdb 中得到 UnicodeEncodeError :(
【解决方案2】:

这个命令显示了什么?

locale

它应该为您显示如下内容:

LC_CTYPE="da_DK.UTF-8"
LC_NUMERIC="da_DK.UTF-8"
LC_TIME="da_DK.UTF-8"
LC_COLLATE="da_DK.UTF-8"
LC_MONETARY="da_DK.UTF-8"
LC_MESSAGES="da_DK.UTF-8"
LC_PAPER="da_DK.UTF-8"
LC_NAME="da_DK.UTF-8"
LC_ADDRESS="da_DK.UTF-8"
LC_TELEPHONE="da_DK.UTF-8"
LC_MEASUREMENT="da_DK.UTF-8"
LC_IDENTIFICATION="da_DK.UTF-8"
LC_ALL=

如果没有,您可以在运行脚本之前尝试这样做:

LANG=da_DK.UTF-8

你没有说当你运行脚本并且遇到这些字符时会发生什么。它们在待办事项文件中吗?他们是按提示输入的吗?有错误信息吗?有什么输出代替了预期的输出吗?

试试这个,看看你会得到什么:

read -p "Enter some characters" string
echo "$string"

【讨论】: