Python 在命令行参数中处理unicode字符

Python 在命令行参数中处理unicode字符,python,python-3.x,command-line-arguments,unicode-string,Python,Python 3.x,Command Line Arguments,Unicode String,我有一个关于Raspberry Pi(基于Raspbian Debian的Linux操作系统)的项目,我必须将命令行参数传递给Python 3程序。我需要能够传递unicode字符串 我不确定这到底应该如何设置。很明显,在将数据传递给Python之前,命令行字符串要经过多次转换 让我们从这样一个事实开始:当我在终端会话中按下所需的击键时,我可以正确地看到Unicode字符。下面是一些测试代码: $ echo "ā" > test.txt $ cat test.txt ā $ hexdump

我有一个关于Raspberry Pi(基于Raspbian Debian的Linux操作系统)的项目,我必须将命令行参数传递给Python 3程序。我需要能够传递unicode字符串

我不确定这到底应该如何设置。很明显,在将数据传递给Python之前,命令行字符串要经过多次转换

让我们从这样一个事实开始:当我在终端会话中按下所需的击键时,我可以正确地看到Unicode字符。下面是一些测试代码:

$ echo "ā" > test.txt
$ cat test.txt
ā
$ hexdump test.txt 
0000000 81c4 000a                              
0000003
该0x81c4字或双字节序列0xc4+0x81被“ā”编码为UTF-8

现在,如果我尝试将同一个字符传递给Python,我会得到一个包含奇怪字符代码的两个字符的字符串:

import sys
param = sys.argv[1]
print([hex(ord(char)) for char in param])

$ python test.py ā
['0xdcc4', '0xdc81']
可以注意到,字符代码与0xc4+0x81字节序列相关,但这里每个字节都添加了0xdc00

如果我进入交互式控制台,unicode字符操作与普通字符相同:

>>> txt = 'ā'
>>> len(txt)
1
>>> hex(ord(txt[0]))
'0x101'
0x101是字符“ā”的正确代码点


因此,我的问题是,我如何才能可靠地将两个字符的
['0xdcc4','0xdc81']
字符串转换为一个字符的字符串“ā”,这将在所有平台上都能正常工作?

我不确定在哪一点发生这种情况,但命令行参数显然只包含ASCII字符,要将字节数组解码为字符串,请使用:

当解码器偶然发现非ASCII字符时,它会根据所选错误处理程序处理解码。在这种情况下,
subrogateScape
错误处理程序将字节替换为从U+DC80到U+DCFF的单个代理代码

因此,解决这一问题的方法是使用相同的
subrogateScape
错误处理程序将错误解码的字符串编码回字节数组,然后将其解码为
utf-8

import sys
param = sys.argv[1]
param_unicode = param.encode('ASCII', 'surrogateescape').decode('utf-8')
print(param_unicode)

$ python test.py ā
ā

但是,如果命令行参数确实总是使用ASCII编码进行解码,则应该进行验证。也许它在不同的平台上是不同的,并且是可配置的。

不知道如何在所有平台上工作,但也许您可以尝试一下:
字节([0xdcc4','0xdc81']]中的[int(s[4:],16)表示s)。解码('utf-8')
import sys
param = sys.argv[1]
param_unicode = param.encode('ASCII', 'surrogateescape').decode('utf-8')
print(param_unicode)

$ python test.py ā
ā