我正在尝试编写一个搜索运行openldap的目录服务器的搜索。
用户将使用他们感兴趣的人的名字或姓氏进行搜索。
我发现重音字符有问题(比如áéíóú
),因为名字和姓氏都是用西班牙语写的,所以虽然正确的方法是Pérez
,但为了搜索,它可以写成为Perez
,没有重音。
如果我使用'(cn=*Perez*)'
,我只会得到非重音结果。
如果我使用'(cn=*Pérez*)'
,我只会获得重音结果。
如果我使用'(cn=~Perez)'
我会得到奇怪的结果(或者至少我无法使用,因为虽然结果包含Perez
和Pérez
次发生,但我也得到了一些明显的结果与查询无关......
在西班牙语中,这种情况发生了很多...无论是懒惰,无论你想称之为什么,事实是,对于这种事情,人们往往不会写重音,因为它可以保证所有这些搜索都适用于这两个选项(我猜是因为Google允许它,所以每个人都认为它应该以这种方式工作)。
除了更新数据库并删除所有重音并在查询中修剪它们之外......你能想到另一种解决方案吗?
答案 0 :(得分:0)
搜索过滤器(“查询”)由RFC2254指定。
编码:
RFC2254
实际上需要过滤器(间接定义)为
OCTET STRING,即ASCII 8字节字符串:
AttributeValue是OCTET STRING,
MatchingRuleId
和AttributeDescription
是LDAPString,LDAPString是OCTET STRING。
转义标准:使用“\”替换特殊字符 ( http://tools.ietf.org/html/rfc4515#page-4,示例 http://tools.ietf.org/html/rfc4515#page-5)。 引用:
< valueencoding>规则确保整个过滤字符串是a 有效的UTF-8字符串,并提供表示的八位字节 ASCII字符“*”(ASCII 0x2a),“(”(ASCII 0x28),“)”(ASCII 0x29),“\”(ASCII 0x5c)和NUL(ASCII 0x00) 表示为反斜杠“\”(ASCII 0x5c),后跟两个十六进制数字 表示编码的八位字节的值。
此外,您应该替换所有语义修改过滤器的字符(RFC 4515的语法给出列表),并使用通配符(*)替换非ASCII字符以确保。这也可以帮助您使用“é”等字符。