为什么只有在传送python脚本的输出时才会出现unicode错误?

2024-06-16 14:21:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用2.7编写的Python脚本(^{},来自文件同步解决方案Seafile)。在

我知道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

^{pr2}$

虽然我知道它可能在一开始就与Ma bibliothèque有问题(但它没有),为什么用管道来触发回溯呢?

这不是外壳的问题吗?-输出在此时“离开”了脚本。在

编辑:answeranother question中。标记为副本。


Tags: 文件indev脚本管道kbisunicode
1条回答
网友
1楼 · 发布于 2024-06-16 14:21:50

Python知道如何处理程序内部的编码,因为它使用终端应用程序正在使用的任何编码。在

发送(管道)输出时,需要对其进行编码。这是因为使用管道实际上在应用程序之间发送字节流。每个管道都是一个单向通道,其中一方写入数据,另一方读取数据。在

使用管道或重定向,将数据发送到fd,由另一个应用程序读取。在

因此,您需要确保Python在发送数据之前对数据进行正确编码,然后输入程序需要在处理之前对其进行解码。在

您可能还发现这个question很有用


更新:我将尝试详细说明编码。我回答的第一行的意思是,因为Python解释器使用特定的编码,它知道如何将hexa值(实际字节)转换为符号。在

我的解释器没有;如果我试图从你的文本中创建一个字符串-我会得到一个错误:

>>> s = 'bibliothèque'
Unsupported characters in input

这是因为我在解释器上使用了不同的编码。在

您的shell使用的编码与Python解释器不同。当Python从程序中发送数据时,它使用默认编码:ASCII。它无法使用ASCII转换您的特殊字符(由hexa值\xe8显示)。因此,您必须指定使用哪种编码才能让Python发送它。在

如果您更改shell编码,您可能能够克服这个问题-请检查这个question on SO。在

PS-Ned Batchelder在youtube上有一段很棒的关于Unicode的视频-也许这会让我们对这个话题有更多的了解。在

相关问题 更多 >