gpt4 book ai didi

IDE 内和外的 Python Unicode

转载 作者:太空宇宙 更新时间:2023-11-03 19:35:05 25 4
gpt4 key购买 nike

当我从 Eclipse IDE 中运行程序时,以下代码完美运行:

address_name = self.text_ctrl_address.GetValue().encode('utf-8')
self.address_list = [i for i in data if address_name.upper() in i[5].upper().encode('utf-8')]

但是当直接使用 python 运行相同的代码时,我收到“UnicodeDecodeError”。

IDE 有何不同之处才不会出现此错误?

ps:我对两个 unicode 字符串进行编码,因为这是针对另一个包含 ñ 或 ç 等字母的字符串测试一个字符串的唯一方法。

编辑:

抱歉,我应该提供更多详细信息:这段代码属于使用 WxPython 构建的对话框。 GetValue() 函数从行编辑小部件获取文本,并尝试将这段文本与数据库进行匹配。该程序在 Windows 上运行(正因为如此,也许上面的 michael Shopsin 可能是对的(“Win-1252 到 UTF-8 是一个严重的麻烦”)。我读过很多次,我应该始终使用 unicode,避免编码,但是如果我不编码,某些字符串方法似乎不能很好地工作,具体取决于单词中的字符(我在西类牙,所以有很多非 ascii 字符)。我直接说的意思是“双击”自行归档,而不是从 IDE 中运行。

最佳答案

UnicodeDecodeError表示错误发生在将字节串解码为 Unicode 的过程中。

特别是,如果您尝试在 Python 2 上编码字节字符串而不是 Unicode 字符串,则可能会发生这种情况:

>>> u"\N{EM DASH}".encode('utf-8').encode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0: ordinal not in range(128)

u"\N{EM DASH}".encode('utf-8')是一个字节串并调用 .encode('utf-8')第二次导致隐式 .decode(sys.getdefaultencoding())这导致 UnicodeDecodeError .

What does the IDE does differently that it doesn't fall on this error ?

它可能在 IDE 中工作,因为它改变了 sys.getdefaultencoding()utf-8不应该这样做。正如您的问题所示,它可能隐藏错误。一般来说,它也可能会破坏不期望非ascii的第3方库sys.getdefaultencoding()在 Python 2 上。

I encode both unicode strings because it is the only way to test one string against another containing letters like ñ or ç.

你应该use unicodedata.normalize() instead :

>>> import unicodedata
>>> a, b = u'\xf1', u'n\u0303'
>>> print(a)
ñ
>>> print(b)

>>> a == unicodedata.normalize('NFC', b)
True

注意:您问题中的代码可能会产生令人惊讶的结果:

#XXX BROKEN, DON'T DO IT
...address_name.upper() in i[5].upper().encode('utf-8')...

address_name.upper()来电 bytes.upper方法同时 i[5].upper()来电 unicode.upper方法。前者不支持 Unicode,它可能取决于当前的语言环境,后者更好,但要执行不区分大小写的比较,请使用 .casefold()方法替代:

key = unicode_address_name.casefold()
... if key == i[5].casefold()...

一般来说,如果您需要对 unicode 字符串进行排序,那么您可以使用 icu.Collator 。比较默认的字典顺序:

>>> L = [u'sandwiches', u'angel delight', u'custard', u'éclairs', u'glühwein']
>>> sorted(L)
[u'angel delight', u'custard', u'gl\xfchwein', u'sandwiches', u'\xe9clairs']

订单在 en_GB区域设置:

>>> import icu # PyICU
>>> collator = icu.Collator.createInstance(icu.Locale('en_GB'))
>>> sorted(L, key=collator.getSortKey)
[u'angel delight', u'custard', u'\xe9clairs', u'gl\xfchwein', u'sandwiches']

关于IDE 内和外的 Python Unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3979162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com