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

标签 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=

编辑 我的环境是 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/

相关文章:

python - 在 Python 中预组合 Unicode 字符序列

json - Emacs 模式编辑 JSON

Python:在csv中查找正确的值

Python字典指针和引用指针?

python - add_cascade() 缺少 1 个必需的位置参数 : self (Python: Tkinter error)

bash - 是否可以使用变量来定义 bash 上的标准输出?

java - 无法在 MySQL 中插入非拉丁符号

python - 使用 re 从 .pgn (字符串行)构建数据框

bash - 如何将数字转换为字母表的第一个字母?

bash - 转换并不总是存在的目录上的文件