2016-05-05 16 views
0

私たちはこのサイトここhttps://pypi.python.org/pypi/datrieのpython datrieは、中国のUnicode文字列の挿入エラー

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)) 

からダウンロードしたPython用datrieパッケージを使用しようとしているが、出力サンプルの言葉は明らかに を挿入した後トライで見つけることができないの範囲であります有効なユニコードワード。

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

これは 'datrie'のバグのようです。私は問題[ここ](https://github.com/kmike/datrie/issues/30)を提出しました。 –

+0

はい、それはそのバグです。リンクを訪問しない人のために、ライブラリは256より大きなサイズのアルファベットの範囲をサポートしていません。 文字列を2回挿入しようとすると、もっと面白いことになります。 (はい、これは魔法です。) – Smylic

答えて

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'] 
関連する問題