jQuery自动完成特殊字符(挪威语)问题

时间:2009-12-29 15:44:03

标签: php javascript jquery

我在挪威网站上使用jQuery的自动完成功能。当输入挪威字符æ,ø和å时,自动完成功能会显示具有相应字符的单词,但不会显示以相应字符开头的单词。似乎我要设法在单词中间对挪威字符进行字符编码,而不是以字母开头的字符。

我正在使用带有我自己的函数的PHP脚本将挪威字符编码为UTF-8并生成自动完成列表。

这真令人沮丧!

代码:

PHP代码:

$q = strtolower($_REQUEST["q"]);
if (!$q) return;

function rewrite($string){

 $to = array('%E6','%F8','%E5','%F6','%EB','%E4','%C6','%D8','%C5','%C4','%D6','%CB', '%FC', '+', ' ');
 $from = array('æ', 'ø', 'å', 'ä', 'ö', 'ë', 'æ', 'ø', 'å', 'ä', 'ö', 'ë', '-', '-');

 $string = str_replace($from, $to, $string);

 return $string;
}

$items是一个包含建议词的数组。

foreach ($items as $key=>$value) {
  if (strpos(strtolower(rewrite($key)), $q) !== false) {
    echo utf8_encode($key)."\n";
  }
}

jQuery代码:

$(document).ready(function(){
$("#autocomplete").autocomplete("/search_words.php", {
        position: 'after',
        selectFirst: false,
        minChars: 3,
        width: 240,
        cacheLength: 100,
        delay: 0
        }
    )
}
);

4 个答案:

答案 0 :(得分:7)

错误(我认为):

  • Strtolower()不会小写特殊字符。
  • 因此,您不会在重写功能(Ä Æ Ø Å等)中转换大写特殊字符。

如果我正确理解了代码,Øygarden的查询(请注意大写字母Ø)会将第一个字符保留为原始格式Ø,但是您要查询urlencode()d格式应该是%C3%98

您应该使用mb_convert_case()指定UTF-8作为编码。

让我知道这是否解决了这个问题。

一般重写建议

您的代码可以使用标准PHP函数100%替换,这些函数可以处理所有Unicode字符,而不仅仅是您指定的字符,因此不易出错。我认为您的自定义rewrite()功能的功能可以替换为

  • urldecode()
  • iconv()
然后,您将获得不再需要utf8_encode()的正确UTF-8编码数据。 有可能以适用于所有角色的方式获得更清晰的方法。 可以也可以排除任何错误(如果错误在您的代码中)。

答案 1 :(得分:0)

我正在使用类似的配置,但使用丹麦语字符(æ,ø和å),我对任何字符都没有问题。您确定要正确编码所有字符吗?

我的回复包含|分隔的值列表。所有值都是UTF-8编码(这是它们存储在数据库中的方式),我将内容类型设置为text / plain; charset = utf-8使用php的头文件功能。尽管如此,它不需要最后一点。

答案 2 :(得分:0)

感谢您的所有答案和帮助。我当然学到了一些关于PHP和编码的新东西:)

但对我有用的解决方案是:

我发现jQuery自动完成功能实际上是UTF-8在将它发送到PHP函数之前编码和小写特殊字符。因此,当我写出建议内容的数组时,我使用rewrite() - 函数来编码特殊字符。所以在我的比较函数中,我只需要小写一切。

现在它很棒!

答案 3 :(得分:0)

我有类似的问题。在我的情况下解决方案是urldecode()php函数将字符串转换回它的原始而不是发送查询到db。