我正在尝试将一个列表中的字符转换为日语中相同索引的另一个列表中的字符(zenkaku to hangaku moji,对于那些感兴趣的人),我无法进行比较。我在比较之前解码为utf-8(解码成ascii破坏了程序),但是比较并没有返回true。有谁知道我做错了什么?这是代码(由于SO的编辑,缩进有点古怪):
#!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()
我错过了一步吗?
答案 0 :(得分:3)
几种。
zk = [
u'。',
u'、',
u'「',
...
...
f = codecs.open(filename, 'r', encoding='utf-8')
...
在努力工作完成之后,我会让你解决剩下的工作。
答案 1 :(得分:1)
确保zk
和hk
列表包含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),
答案 2 :(得分:0)
您需要将所有内容转换为相同的表单,并且表单是Unicode字符串。 Unicode字符串在.encode()
或.decode()
的意义上没有编码。当具有非unicode字符串时,它实际上是一个字节流,表示某些编码中的值。转换为Unicode时,您必须.decode()
。将Unicode字符串存储到字节序列时,必须将.encode()
抽象为具体字节。
这样,从UTF-8编码文件加载Unicode字符串,或者你必须将它读入旧字符串(非Unicode,字节序列)然后.decode('utf-8')
,或者你可以使用`编解码器.open(...,encoding ='utf-8') - 然后你自动获得Unicode字符串。
表单# coding=utf-8
不是通常的,但是没关系......如果编辑器(我的意思是你用来编写文本的工具)也是这样想的。然后编辑器正确显示旧字符串。在他们应该.decode('utf-8')
d获取Unicode的情况下。只有在同一源中具有ASCII字符的旧字符串也可以使用.decode('utf-8')
转换为Unicode。
总结一下:您是 de 从字节到Unicode的编码,并且 en 将Unicode字符串编码为字节序列。从问题看来,你正在做相反的事情。
以下是完全错误的:
for f in filecontent:
for z in zk:
if f == z.decode('utf-8'):
print f
因为filecontent
是f.read()
的结果。这样它就是一个字节序列。循环中的f
是一个字节。 z.decode('utf-8')返回一个Unicode字符。他们无法比较。 (顺便说一下,f
是一种对字节值有误导性的名称。)