我使用2.7编写的Python脚本(^{
我知道unicode is problematic in Python 2但幸运的是,启动脚本时正确处理了带发音符号的文件名:
$ # seaf-cli status
# Name Status Progress
photos downloading 0/0, 0.0KB/s
Ma bibliothèque downloading 566/1770, 1745.7KB/s
videos downloading 28/1203, 5088.0KB/s
dev-perso downloading 0/0, 0.0KB/s
dev-pro downloading 0/0, 0.0KB/s
令我惊讶的是,当管道输出这个输出时,Python脚本会崩溃,并显示UnicodeEncodeError
:
虽然我知道它可能在一开始就与Ma bibliothèque
有问题(但它没有),为什么用管道来触发回溯呢?
这不是外壳的问题吗?-输出在此时“离开”了脚本。在
编辑:answer在another question中。标记为副本。
Python知道如何处理程序内部的编码,因为它使用终端应用程序正在使用的任何编码。在
当发送(管道)输出时,需要对其进行编码。这是因为使用管道实际上在应用程序之间发送字节流。每个管道都是一个单向通道,其中一方写入数据,另一方读取数据。在
使用管道或重定向,将数据发送到fd,由另一个应用程序读取。在
因此,您需要确保Python在发送数据之前对数据进行正确编码,然后输入程序需要在处理之前对其进行解码。在
您可能还发现这个question很有用
更新:我将尝试详细说明编码。我回答的第一行的意思是,因为Python解释器使用特定的编码,它知道如何将hexa值(实际字节)转换为符号。在
我的解释器没有;如果我试图从你的文本中创建一个字符串-我会得到一个错误:
这是因为我在解释器上使用了不同的编码。在
您的shell使用的编码与Python解释器不同。当Python从程序中发送数据时,它使用默认编码:ASCII。它无法使用ASCII转换您的特殊字符(由hexa值\xe8显示)。因此,您必须指定使用哪种编码才能让Python发送它。在
如果您更改shell编码,您可能能够克服这个问题-请检查这个question on SO。在
PS-Ned Batchelder在youtube上有一段很棒的关于Unicode的视频-也许这会让我们对这个话题有更多的了解。在
相关问题 更多 >
编程相关推荐