2013-11-03 100 views
0

我想要统计以UTF-8格式保存的Urdu文档中相同单词的数量。在python中比较unicode和unicode

所以例如我已经含有3个由空格隔开完全相同词语文件

خُداوند خُداوند خُداوند 

我试图通过使用以下代码读取文件来算的话:

 file_obj = codecs.open(path,encoding="utf-8") 
     lst = repr(file_obj.readline()).split(" ") 
     word = lst[0] 
     count =0 
     for w in lst: 
      if word == w: 
       count += 1 
     print count 

但该值计数我得到是1,而我应该得到3.

如何比较Unicode字符串?

+1

lst'打印为什么?我有''u'\ u062e \ u0646 \ u062f',u'\ u062e \ u064f \ u062f \ u0627 \ u0648 \ u0646 \ u062f',u'\ u062e \ u064f \ u062f \ u0627 \ u0648 \ u0646 \ u062f']'和那些完全相同(您的代码工作)。但是如果有任何非规范化的形式,那么它们将不会完全相同。 –

+0

请参阅[规范化Unicode](http://stackoverflow.com/q/16467479),了解使用非规范化代码点处理Unicode值的正确方法。 –

+0

并删除'repr()'。你刚刚在字符串的开始和结尾添加了'u''和'''。所以'word'现在是''u'\ u062e \ u0646 \ u062f \ u0648 \ u0646 \ u062f','lst [1]'是''\ u062e \ u064f \ u062f \ u0627 \ u0648 \ u0646 \ u062f' '和'list [2]'是''\ u062e \ u0646 \ u062f \ u0627 \ u0646 \ u062f'''。这些字符串显然*不等于。 –

回答

3

从你的代码中删除repr()。仅使用repr()来创建调试输出;你将一个unicode值转换成一个可以粘贴回解释器的字符串。

这意味着从该文件的行现在被存储为:

>>> repr(u'خُداوند خُداوند خُداوند\n').split(" ") 
["u'\\u062e\\u064f\\u062f\\u0627\\u0648\\u0646\\u062f", '\\u062e\\u064f\\u062f\\u0627\\u0648\\u0646\\u062f', "\\u062e\\u064f\\u062f\\u0627\\u0648\\u0646\\u062f\\n'"] 

注意反斜杠(转义Unicode转义)和第一串u'开始,最后一个字符串与\\n'结束。这些值显然不相等。

取出repr(),并使用.split()不带参数去除尾随空白太多:

lst = file_obj.readline().split() 

,你的代码将工作:

>>> res = u'خُداوند خُداوند خُداوند\n'.split() 
>>> res[0] == res[1] == res[2] 
True 

您可能需要正常化的先输入;一些字符可以表示为一个unicode码点或者两个合并码点。规范化将所有这些字符移动到组合或分解状态。见Normalizing Unicode

1

尝试清除repr

lst = file_obj.readline().split(" ") 

的一点是,你至少应该print变量,如lstw,看看它们是什么。

+0

即使*带''repr()'示例输入仍然有效;当然OP不应该使用它,但是。 –

+0

啊,不,第一个字符串会有'u'',第二个没有引号,第三个是''''。 –

+0

@MartijnPieters是的,我已经尝试过,然后我发布;) – satoru

0

比较Unicode字符串在Python:

a = u'Artur' 
print(a) 
b = u'\u0041rtur' 
print(b) 

if a == b: 
    print('the same') 

结果:

Artur 
Artur 
the same