gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:03:25 40 4
gpt4 key购买 nike

我在 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,版本 4.3.48(1)-release (x86_64-pc-linux-gnu)

最佳答案

设置您的区域设置

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'

关于python - bash 变量中的中文字符处理方式与文件中不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55579383/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com