2009-12-29 6 views
2

J'utilise la fonction de saisie semi-automatique de jQuery sur mon site norvégien. Lorsque vous tapez les caractères norvégiens æ, ø et å, la fonction de saisie semi-automatique suggère des mots avec le caractère correspondant, mais pas des mots commençant par le caractère correspondant. Il me semble que je dois gérer les caractères norvégiens au milieu des mots, mais pas les caractères qui commencent par les caractères. J'utilise un script PHP avec ma propre fonction pour encoder des caractères norvégiens en UTF-8 et générer la liste de saisie semi-automatique.jQuery autocomplétion caractères spéciaux (norvégien) problèmes

C'est vraiment frustrant!

code:

Code 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 est un tableau containg suggestion mots.

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

Code jQuery:

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

Recevez-vous des retours valides lorsque vous utilisez un caractère non-codé dans la première position? Et comment construisez-vous la liste de retour - pourrait aider à voir ce code \ query. – menkes

+4

Pourquoi utilisez-vous un script d'encodage personnalisé, pourquoi ne pas publier des données dans utf-8 avec ajax? – dfilkovi

+0

poster du code !!! – Galen

Répondre

0

Merci pour toutes les réponses et l'aide. J'ai certainement appris de nouvelles choses sur PHP et l'encodage :)

Mais la solution qui a fonctionné pour moi était le suivant:

J'ai découvert que la fonction de saisie semi-automatique jQuery en fait UTF-8 encode et caractère spécial minuscule avant de l'envoyer à la fonction PHP. Donc, quand j'écris les tableaux de suggérer le contenu, j'ai utilisé ma fonction rewrite() pour encoder les caractères spéciaux. Donc, dans ma fonction de comparaison, je devais tout minuscule.

Maintenant, cela fonctionne très bien!

0

J'utilise une configuration similaire, mais avec des caractères danois (æ, ø et å) et je n'ai pas de problème avec les caractères. Êtes-vous sûr de bien encoder tous les caractères?

Ma réponse contient un | liste délimitée de valeurs. Toutes les valeurs sont encodées en UTF-8 (c'est comme ça qu'elles sont stockées dans la base de données), et j'ai mis le type de contenu à text/plain; charset = utf-8 en utilisant la fonction d'en-tête de php. Le dernier bit n'est pas nécessaire pour que cela fonctionne.

  • Frank
7

Le bug (je pense):

  • Strtolower() seront pas en minuscules caractères spéciaux.
  • Par conséquent, vous n'êtes pas en train de convertir des caractères spéciaux en capital dans votre fonction re-écriture (Ä Æ Ø Å etc.)

si je comprends correctement le code, une requête pour Øygarden (Notez le Ø du capital) laisserait le premier caractère dans sa forme originale Ø, mais vous interrogez contre la forme d urlencode() qui devrait être %C3%98

vous devez utiliser mb_convert_case() spécifier UTF-8 comme encodage. Faites-moi savoir si cela résout le problème.

suggestions re-écriture générales

Votre code pourrait être remplacé 100% en utilisant des fonctions PHP standard, qui peut gérer tous les caractères Unicode au lieu de simplement ceux que vous spécifiez, étant ainsi moins sujettes à des bogues.Je pense que la fonctionnalité de votre fonction personnalisée rewrite() pourrait être remplacé par

alors vous obtenir des données codées UTF-8 approprié que vous n'avez pas besoin à plus. Il pourrait être possible d'obtenir une approche plus propre qui fonctionne pour tous les caractères. Il pourrait aussi être aussi cela qui trie déjà quel que soit le bogue (si le bogue est dans votre code).

0

J'ai rencontré un problème similaire. solution dans mon cas était urldecode() fonction php pour convertir la chaîne en son original et que d'envoyer la requête à DB.