为什么我无法在Mac OS X Terminal.app中显示Python解释器的unicode字符?

10 投票
1 回答
10887 浏览
提问于 2025-04-15 22:03

我在我的Python解释器里尝试粘贴一个Unicode字符,比如这个中间的点:

·

但是它没有任何反应。我在Mac OS X的Terminal.app里使用bash时,粘贴这个字符没有问题:

:~$ ·

但是在解释器里:

:~$ python
Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 

我什么也得不到,它就是忽略我刚粘贴的字符。如果我使用中间点的转义表示法 \xNN\xNN,即 '\xc2\xb7',然后尝试转换成Unicode,想要显示这个点时,解释器会报错:

>>> unicode('\xc2\xb7')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)

我在sitecustomize.py里把默认编码设置成了'utf-8',所以:

>>> sys.getdefaultencoding()
'utf-8'

到底怎么回事?不是Terminal的问题,也不是Python的问题,我到底哪里做错了?!

这个问题和这个问题无关,因为那个人能够在他的Terminal里粘贴Unicode。

1 个回答

6

unicode('\xc2\xb7') 这个代码的意思是用默认的编码方式来解码这个字节串,而默认的编码方式是ascii。这样做当然会失败,因为尝试设置不同的默认编码方式通常效果不好,尤其是对于“粘贴的字面量”来说,这样的设置根本不适用——那需要另外一种设置。你可以试试用 u'\xc2\xb7',看看结果:

>>> print(u'\xc2\xb7')
·

因为这实际上是两个 unicode 字符。当然,下面这个:

>>> print(u'\uc2b7')
슷

会给你一个单一的 unicode 字符(看起来像是某种东方字符——抱歉,我对这些不太了解)。顺便说一下,这两个都不是你想要的“中间点”。也许你想要的是:

>>> print('\xc2\xb7'.decode('utf8'))
·

这个确实是中间点。顺便提一下,对于我来说(在 Mac 的 Terminal.app 上使用 python 2.6.4):

>>> print('슷')
슷

这让我有点惊讶(我本来以为会出错...!)。

撰写回答