我在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 $C
或cat 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)
。
答案 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'