use*_*196 3 python string unicode comparison encoding
我对python很陌生。我正在尝试从另一个列表中删除出现在一个列表中的文件。这些列表是通过在 mac 和 windows 上重定向 ll -R 生成的(但已经进行了一些处理 - 合并、排序等 - 使用其他 python 脚本)。某些文件名带有重音符号和特殊符号。这些字符串,即使它们相同(打印相同并且在包含列表的文件中看起来相同)被发现是不相等的。
我找到了关于如何在 unicode 中比较字符串与特殊字符的线程: Python 字符串比较——特殊/Unicode 字符的问题 这与我的问题非常相似。我对编码以及如何更改字符串的编码做了更多阅读。但是,我尝试了在编解码器文档中可以找到的所有编解码器:https : //docs.python.org/2/library/codecs.html 对于所有可能的编解码器对,这两个字符串不相等(请参阅下面的程序 - 尝试了两者解码和编码选项)。
当我一一查看两个字符串中的字符时,重音 e 在一个文件中显示为重音 e(一个字符),在另一个文件中显示为两个字符(e 和可打印为空格)。
任何想法,将不胜感激。
我将两个文本文件缩小到一行一个单词(显然带有重音)。我将文本文件上传到 dropbox:testfilesindata和testmissingfiles(但还没有尝试从 dropbox 下载新副本)。
非常感谢!
附注。抱歉弄乱了链接。我没有声望 10 ...
#!/usr/bin/python3
import sys
codecs = [ 'ascii', 'big5', 'big5hkscs', 'cp037', 'cp424', 'cp437', 'cp500', 'cp720 ', 'cp737 ', 'cp775', 'cp850', 'cp852', 'cp855', 'cp856 ', 'cp857', 'cp858', 'cp860', 'cp861', 'cp862', 'cp863', 'cp864', 'cp865', 'cp866', 'cp869', 'cp874 ', 'cp875 ', 'cp932', 'cp949', 'cp950', 'cp1006 ', 'cp1026', 'cp1140', 'cp1250', 'cp1251', 'cp1252', 'cp1253', 'cp1254', 'cp1255', 'cp1256', 'cp1257', 'cp1258', 'euc_jp', 'euc_jis_2004', 'euc_jisx0213', 'euc_kr', 'gb2312', 'gbk', 'gb18030', 'hz', 'iso2022_jp', 'iso2022_jp_1', 'iso2022_jp_2', 'iso2022_jp_2004', 'iso2022_jp_3', 'iso2022_jp_ext', 'iso2022_kr', 'latin_1', 'iso8859_2', 'iso8859_3', 'iso8859_4', 'iso8859_5', 'iso8859_6', 'iso8859_7', 'iso8859_8', 'iso8859_9', 'iso8859_10', 'iso8859_13', 'iso8859_14', 'iso8859_15', 'iso8859_16', 'johab', 'koi8_r ', 'koi8_u ', 'mac_cyrillic', 'mac_greek', 'mac_iceland', 'mac_latin2', 'mac_roman', 'mac_turkish', 'ptcp154', 'shift_jis', 'shift_jis_2004', 'shift_jisx0213', 'utf_32', 'utf_32_be', 'utf_32_le', 'utf_16', 'utf_16_be', 'utf_16_le', 'utf_7', 'utf_8', 'utf_8_sig' ]
file1 = open('testmissingfiles','r')
file2 = open('testfilesindata','r')
list1 = file1.readlines()
list2 = file2.readlines()
word1 = list1[0].rstrip('\n')
word2 = list2[0].rstrip('\n')
for i in range(0,len(codecs)-1):
for j in range(0,len(codecs)-1):
try:
encoded1 = word1.decode(codecs[i])
encoded2 = word2.decode(codecs[j])
if encoded1 == encoded2:
sys.stdout.write('Succeeded with ' + codecs[i] + ' & ' + codecs[j] + '\n')
except:
pass
Run Code Online (Sandbox Code Playgroud)
用于unicodedata.normalize将 to 字符串规范化为相同的规范形式:
import unicodedata
encoded1 = unicodedata.normalize('NFC', word1.decode('utf8'))
encoded2 = unicodedata.normalize('NFC', word2.decode('utf8'))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3377 次 |
| 最近记录: |