我正在编写这个小脚本:基本上它将list元素(其中包含特殊字符)映射到它的索引以创建字典。
#!/usr/bin/env python
#-*- coding: latin-1 -*-
ln1 = '?0>9<8~7|65"4:3}2{1+_)'
ln2 = "(*&^%$£@!/`'\][=-#¢"
refStr = ln2+ln1
keyDict = {}
for i in range(0,len(refStr)):
keyDict[refStr[i]] = i
print "-" * 32
print "Originl: ",refStr
print "KeyDict: ", keyDict
# added just to test a few special characters
tsChr = ['£','%','\\','¢']
for k in tsChr:
if k in keyDict:
print k, "\t", keyDict[k]
else: print k, "\t", "not in the dic."
它返回如下结果:
Originl: (*&^%$£@!/`'\][=-#¢?0>9<8~7|65"4:3}2{1+_)
KeyDict: {'!': 9, '\xa3': 7, '\xa2': 20, '%': 4, '$': 5, "'": 12, '&': 2, ')': 42, '(': 0, '+': 40, '*': 1, '-': 17, '/': 10, '1': 39, '0': 22, '3': 35, '2': 37, '5': 31, '4': 33, '7': 28, '6': 30, '9': 24, '8': 26, ':': 34, '=': 16, '<': 25, '?': 21, '>': 23, '@': 8, '\xc2': 19, '#': 18, '"': 32, '[': 15, ']': 14, '\\': 13, '_': 41, '^': 3, '`': 11, '{': 38, '}': 36, '|': 29, '~': 27}
这一切都很好,除了字符£
,%
和\
分别转换为\xa3
,\xa2
和\\
。有人知道为什么打印ln1
/ln2
很好,但字典却不行。我该怎么解决?非常感谢您的帮助。干杯!!
我添加了额外的特殊字符-#
和¢
,然后我得到了@Duncan的建议:
! 9
? 7
? 20
% 4
$ 5
....
....
8 26
: 34
= 16
< 25
? 21
> 23
@ 8
? 19
....
....
请注意,第7、19和20个元素,它们根本没有正确打印。第21个元素是实际的?
字符。干杯!!
只是把这个循环添加到我最初的帖子中,来测试我的目的:
tsChr = ['£','%','\\','¢']
for k in tsChr:
if k in keyDict:
print k, "\t", keyDict[k]
else: print k, "\t", "not in the dic."
我得到的结果是:
£ not in the dic.
% 4
\ 13
¢ not in the dic.
运行脚本时,它认为£
和¢
实际上不在字典中,这是我的问题。有人知道如何解决这个问题,或者我做错了什么/我做错了什么?
最后,我将检查字典中某个文件(或一行文本)中的字符,看它是否存在,以及是否有可能在文本中包含é
或£
等字符。干杯!!
在我看来,学习一般的unicode和it's use in python
如果你不想知道人们为什么要把事情搞砸,所以你必须处理一个“\xa3”,而不是一个简单的
£
,那么邓肯的回答是完美的,告诉你你想知道的一切。更新(请参阅更新2)
请断言您的文件是用拉丁语-1编码保存的,并且现在是非utf-8,您的测试将通过(或者将
#-*- coding: latin-1 -*-
更改为#-*- coding: utf-8 -*-
)从我上面的链接中,你可以很容易地理解阅读(和理解)内容:
您的文件被保存为utf-8,这意味着对于char
£
使用2个字节,但是由于您告诉python解释器编码是拉丁语-1,因此他将使用一个键的2个utf-8字节中的每个字节。实际上,我可以在
ln2
中计算19个字符,但是如果您发出len(ln2)
,它将返回21个字符。当您测试
'£' in keyDict.keys()
时,您正在寻找一个2个字符的字符串,而每个2个字符在字典中都有自己的键,这就是为什么它找不到它。您还可以测试
len(keyDict)
,发现它比您预期的要长。我想这说明了一切,请理解不是所有的故事都很容易在一个网页上解释,但上面的链接,在我看来是一个很好的起点,混合了一些故事和一些编码示例。
干杯
备注:我正在使用这段代码,并将其保存为UTF-8,它工作得非常完美:
当您打印包含字符串的字典或列表时,Python将显示字符串的
repr()
。如果您print repr(ln2)
,您将看到没有任何变化:您的字典键只是'.'&c.字符的拉丁-1编码。如果你这样做了:
然后字符将按您的预期显示。
相关问题 更多 >
编程相关推荐