bash变量中的汉字与文件中的汉字处理方式不同

时间:2019-04-08 18:10:59

标签: python bash unicode cjk

我在curl输出中接收汉字,然后将它们作为输入提供给Python脚本,但是根据我对字符的处理方式,我会得到两种截然不同的行为。

我更喜欢的方法是给我一个UnicodeEncodeError。

首选方法:

read -r C < <(curl ...)
python3 -c "import sys, urllib.parse; \
            urllib.parse.quote(sys.argv[1])" "$C"
# UnicodeEncodeError: 'utf-8' codec can't encode character '\udce5' in position 0: surrogates not allowed

替代方法:

curl ... > tmp.txt
python3 -c "import urllib.parse; \
            with open('tmp.txt', encoding='utf-8') as f: \
                print(urllib.parse.quote(f.read()))"
# Outputs %E5%85%89%0A

我有什么办法可以使第一个使用bash变量的方法起作用?当我echo $Ccat tmp.txt时,汉字会正确打印到我的终端上。

当我在计算机上运行locale时,我得到:

LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

编辑 我的环境是烤面包片(在ChromeOS上)。我的拳头是GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)

1 个答案:

答案 0 :(得分:0)

设置您的语言环境

python在解释argv时使用LC_CTYPE。强制使用UTF8语言环境。

read -r C < <(curl ...)
LC_CTYPE='en_US.UTF8' python3 -c "import sys, urllib.parse; \
            print(urllib.parse.quote(sys.argv[1]))" "$C"

除了设置LC_CTYPE以外,您还可以只设置LANG,这取决于系统的其他部分是否不使用LC_CTYPE

或将其默认配置为一个。

安装语言环境(如有必要)

如果命令LC_CTYPE='en_US.UTF8'导致错误,则可能未安装en_US.UTF8语言环境(或您选择的任何语言环境)。

您可以通过运行locale -a来查看安装了哪些语言环境。要安装“ en_US.UTF8”语言环境:

sudo locale-gen 'en_US'
sudo locale-gen 'en_US.UTF-8'