这是问题,我有一个unicode字符串作为python sqlite查询的输入。查询失败('like')。结果是字符串,'FRANCE'没有6个字符,它有7个字符。第七是。 。 。 unicode U + FEFF,零宽度不间断空间。
如何在查询之前捕获一类此类内容?
答案 0 :(得分:10)
您可以将unicodedata类别用作Python中unicode数据表的一部分:
>>> unicodedata.category(u'a')
'Ll'
>>> unicodedata.category(u'.')
'Po'
>>> unicodedata.category(u',')
'Po'
如您所见,标点字符的类别以“P”开头。 所以你需要通过char过滤掉char(使用列表推导)。
另见:
在你的情况下:
>>> unicodedata.category(u'\ufeff')
'Cf'
因此,您可以根据字符类别执行一些白名单。
答案 1 :(得分:1)
通常,如果您可以为您的用例定义此类内容,则应使用允许字符的白名单来完成输入验证。然后,您只需丢弃任何不在白名单上的内容(或完全拒绝输入)。
如果可以定义一组允许的字符,那么您可以使用正则表达式去除其他所有字符。
例如,假设您知道“country”只会包含大写的英文字母和空格,您可以删除其他所有内容,包括您喜欢的令人讨厌的unicode字母:
>>> import re
>>> country = u'FRANCE\ufeff'
>>> clean_pattern = re.compile(u'[^A-Z ]+')
>>> clean_pattern.sub('', country)
u'FRANCE'
如果无法定义一组允许的字符,那么您就会陷入困境,因为预测所有可能出现的数万个可能的意外unicode字符成为您的任务你 - 随着语言多年来不断发展,越来越多的规范被添加到规范中。
答案 2 :(得分:0)
这也是字节顺序标记,BOM。首先要清理你的字符串以消除它们,使用类似的东西:
>>> f = u'France\ufeff'
>>> f
u'France\ufeff'
>>> print f
France
>>> f.replace(u'\ufeff', '')
u'France'
>>> f.strip(u'\ufeff')
u'France'