python datrie中文unicode字符串插入错误

时间:2016-05-05 03:22:04

标签: python trie

我们正在尝试使用从此站点https://pypi.python.org/pypi/datrie

下载的python的datrie包
import string
import datrie
import re
import codecs
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

sys.stdin = codecs.getreader('utf-8')(sys.stdin)
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
sys.stderr = codecs.getwriter('utf-8')(sys.stderr)

trie = datrie.Trie(ranges = [(u'\u0000', u'\u9FFF')])

n = 0 
dict = {}
for line in sys.stdin:
    line = line.strip('\r\n')
    #line =  line.decode('utf8','ignore')
    dict[line] = True
print "dict load over: %d" % (len(dict))


print >>sys.stderr, "insert"

for str,value in dict.iteritems():
    trie[str] = True
    if str not in trie:
        #print str.encode('utf8','ignore')
        print >> sys.stderr, str 
        print >> sys.stderr, repr(str)

print "trie load over: %d" % (len(trie))

这里是插入后无法在trie中找到的输出样本字 显然,unicode字的范围是有效的。

颖礼仿古烟盒折扣
u'\u9896\u793c\u4eff\u53e4\u70df\u76d2\u6298\u6263'

1 个答案:

答案 0 :(得分:0)

以下是可用的解决方案。

>>> import datrie
>>> trie = datrie.Trie(ranges=[(u'\x00', u'\xff')])
>>> key="颖礼仿古烟盒折扣"
>>> trie[key.decode('latin1')]=42
>>> trie[key.decode('latin1')]
42
>>> trie.keys()
[u'\xe9\xa2\x96\xe7\xa4\xbc\xe4\xbb\xbf\xe5\x8f\xa4\xe7\x83\x9f\xe7\x9b\x92\xe6\x8a\x98\xe6\x89\xa3']