Mat*_*boz 4 python bash encoding invocation
像一个简单的文件
$ cat x.py
x = u'Gen\xe8ve'
print x
Run Code Online (Sandbox Code Playgroud)
跑步时会给我:
$ python x.py
Genève
Run Code Online (Sandbox Code Playgroud)
但是,当作为"命令替换"运行时,将给出:
$ echo $(python x.py)
...
UnicodeEncodeError: 'ascii' codec...
Run Code Online (Sandbox Code Playgroud)
我尝试过使用不同的终端模拟器(xterm,gnome-term)和ttyS上的控制台.用bash和sh.用python2.4和2.7.在运行python之前,我已经尝试将LC_ALL或LANG设置为某些utf-8语言环境.我检查了sys.getdefaultencoding().没有任何帮助.
当从另一个进程(如java)调用脚本时也会出现问题,但上面是我发现复制它的最简单方法.
我不明白这两个电话之间有什么区别.有人可以帮忙吗?
这里的问题是,在第二个调用中,您基本上是在写一个只接受字节串(类文件对象)的管道.如果您尝试执行此操作,也会发生同样的情况
python x.py > my_file
Traceback (most recent call last):
File "x.py", line 2, in <module>
print x
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe8' in position 3: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
由于接收器只能理解字节串而不是unicode字符,因此必须首先使用以下encode函数将unicode字符串编码为字节串:
x = u'Gen\xe8ve'.encode('utf-8')
print x
Run Code Online (Sandbox Code Playgroud)
这将打印编码为utf-8字节字符串(字节序列)的unicode字符串,允许将其写入类文件对象.
$echo $(python x.py)
Genève
$python x.py
Genève
Run Code Online (Sandbox Code Playgroud)