2011-10-06 53 views
0

我试图将一个列表中的字符转换成另一个列表中的字符,这些字符在日文中是相同的索引(对于那些感兴趣的人来说,这是日文中的相关索引),我无法得到比较结果。我在比较之前解码为utf-8(解码为ascii破坏了程序),但是比较不会返回true。有谁知道我做错了什么?这里的代码(由于SO的编辑,缩进有点古怪):Python:我如何比较unicode和ascii文本?

#!C:\Python27\python.exe 
# coding=utf-8 
import os 
import shutil 
import sys 

zk = [ 
'。', 
'、', 
'「', 
'」', 
'(', 
')', 
'!', 
'?', 
'・', 
'/', 
'ア','イ','ウ','エ','オ', 
'カ','キ','ク','ケ','コ', 
'サ','シ','ス','セ','ソ', 
'ザ','ジ','ズ','ゼ','ゾ', 
'タ','チ','ツ','テ','ト', 
'ダ','ヂ','ヅ','デ','ド', 
'ラ','リ','ル','レ','ロ', 
'マ','ミ','ム','メ','モ', 
'ナ','ニ','ヌ','ネ','ノ', 
'ハ','ヒ','フ','ヘ','ホ', 
'バ','ビ','ブ','ベ','ボ', 
'パ','ピ','プ','ペ','ポ', 
'ヤ','ユ','ヨ','ヲ','ン','ッ' 
] 

hk = [ 
'。', 
'、', 
'「', 
'」', 
'(', 
')', 
'!', 
'?', 
'・', 
'/', 
'ア','イ','ウ','エ','オ', 
'カ','キ','ク','ケ','コ', 
'サ','シ','ス','セ','ソ', 
'ザ','ジ','ズ','ゼ','ゾ', 
'タ','チ','ツ','テ','ト', 
'ダ','ヂ','ヅ','デ','ド', 
'ラ','リ','ル','レ','ロ', 
'マ','ミ','ム','メ','モ', 
'ナ','ニ','ヌ','ネ','ノ', 
'ハ','ヒ','フ','ヘ','ホ', 
'バ','ビ','ブ','ベ','ボ', 
'パ','ピ','プ','ペ','ポ', 
'ヤ','ユ','ヨ','ヲ','ン','ッ' 
] 

def main(): 
if len(sys.argv) > 1: 
    filename = sys.argv[1] 
else: 
    print("Please specify a file to check.") 
    return 

try: 
    f = open(filename, 'r') 
except IOError as e: 
    print("Sorry! The file doesn't exist.") 
    return 

filecontent = f.read() 
f.close() 

#y = zk[29] 
#print y.decode('utf-8') 

for f in filecontent: 
    for z in zk: 
     if f == z.decode('utf-8'): 
     print f 

print filename 



if __name__ == "__main__": 
main() 

我是否错过了一个步骤?

回答

3

几个。

zk = [ 
u'。', 
u'、', 
u'「', 
... 

... 
    f = codecs.open(filename, 'r', encoding='utf-8') 
... 

我会让你解决其余的工作,现在已经完成了艰苦的工作。

+1

我假设'z'上的'decode'调用(在原始代码中)是为了补偿'zk'包含'str'对象而不是'unicode'对象,但是使用unicode字符串你已经表明的第一个地方绝对看起来更清洁。 –

+0

优秀!谢谢!你帮我修好了。 – StormShadow

1

确保zkhk列表包含Unicode字符串。无论是使用Unicode文本例如,u'a'或它们在运行时进行解码:

fromutf8 = lambda s: s.decode('utf-8') if not isinstance(s, unicode) else s 
zk = map(fromutf8, zk) 
hk = map(fromutf8, hk) 

你可以使用unicode.translate()同一索引处的字符转换成一个列表转换成字符在另一个列表:

import codecs 

translation_table = dict(zip(map(ord,zk), hk)) 
with codecs.open(sys.argv[1], encoding='utf-8') as f: 
    for line in f: 
     print line.translate(translation_table), 
0

您需要将所有内容转换为相同的格式,并且格式为Unicode字符串。 Unicode字符串没有编码意义上的.encode().decode()。当有一个非Unicode字符串时,它实际上是一个字节流,表示某种编码中的值。转换为Unicode时,您必须.decode()。当将Unicode字符串存储为一个字节序列时,您必须将.encode()抽象为具体的字节。

这种方式,从UTF-8编码的文件加载Unicode字符串时,或者必须将其读入老串(非Unicode中,字节序列),然后.decode('utf-8'),或者可以使用`codecs.open( ...,encoding ='utf-8') - 那么你会自动获得Unicode字符串。

表格# coding=utf-8不是通常的,但它是可以的......如果编辑(我的意思是你用来写文本的工具)也这样认为。然后编辑器正确显示旧的字符串。在这种情况下,他们应该是.decode('utf-8') d来获得Unicode。使用.decode('utf-8')也可以将仅具有ASCII字符的旧字符串转换为Unicode。

总结:你是从字节编码为Unicode,你是编码的Unicode字符串转换为一个字节序列。从这个问题看来,你正在做相反的事情。

下是完全错误的:

for f in filecontent: 
    for z in zk: 
     if f == z.decode('utf-8'): 
      print f 

因为filecontentf.read()结果。这是一个字节序列。循环中的f是一个字节。 z.decode('utf-8')返回一个Unicode字符。他们不能相提并论。 (顺便说一下,f是一种字节值的误导性名称。)