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

问题描述 投票:1回答:1

我在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=

编辑我的环境是crouton(在ChromeOS上)。我的bash是GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)

python bash unicode cjk
1个回答
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'
© www.soinside.com 2019 - 2024. All rights reserved.