2017-09-06 1 views
1

J'utilise PDO pour me connecter à une base de données MySQL. Dans ma chaîne de connexion, j'ai déjà ajouté charset=utf8mb4 et toutes mes bases de données et tables sont utf8mb4_unicode_ci, mais je suis confronté à un problème.Problèmes de codage des caractères de recherche PHP MySQL

Pour rechercher des entrées en fonction de leur titre sur content tableau que je utilise le code ci-dessous:

SELECT * FROM content WHERE title LIKE '%سيگنالها%'

le mot-clé est un mot persan. Maintenant, le code ci-dessus renvoie 1 résultat qui est correct et comme prévu.

Mais Si je fais une forme dans mon application PHP et entrez le mot SAME soit en utilisant un macOS/PC Windows ou en utilisant un téléphone Android que je reçois 0.

J'ai suivi cette question vers le bas et il semble que même si les mots saisis par l'utilisateur sont exactement les mêmes que celui déjà dans la base de données, ils sont en fait pas même.

Selon cette online tool, le code de caractère décimal

pour سيگنالها il est: 1587, 1 0, 1711, 1606, 1575, 1604, 1607, 1575

Alors que

pour سیگنالها il est: 1587, 1 0, 1711, 1606, 1575, 1604, 1607, 1575

Avez-vous e place La différence? C'est en gras. En fait, si vous copiez les deux valeurs et les passez en here, vous verrez la différence par vous-même. Que puis-je faire pour résoudre ce problème ennuyant?

J'utilise PHP 7 et MariaDB 10.1.

+0

ce qui est le jeu de caractères de la page? il doit être utf-8 et aussi, vous devez exécuter 'SET NAMES utf8' après la connexion mysql. veuillez poster un code d'échantillon. – Akam

+0

@Akam C'est «utf-8» aussi ce qui précède peut être testé dans phpmyadmin. Mêmes résultats – VSG24

+0

Ok, c'est une question de clavier, j'utilise aussi Unikurd (kurdish sorani) les mêmes lettres que le persan et l'arabe, parfois, un utilisateur utilisant un clavier qui a différentes entités Unicode que celui enregistré dans la base de données, mais nous avons résolu ce problème en remplaçant les lettres par des communes. – Akam

Répondre

1

Ce ne sont pas les mêmes caractères, même s'ils ont la même apparence lorsqu'ils sont assemblés et peuvent même avoir la même signification.

La première chaîne (1610) est la lettre arabe FARSI YEH [1] tandis que l'autre (1740) est ARABIC LETTER YEH [2].

[1] https://en.wiktionary.org/wiki/%DB%8C [2] https://en.wiktionary.org/wiki/%D9%8A

J'ai aussi créé un formulaire simple pour PHP et testé les deux chaînes pour voir si la valeur envoyée par $ _POST est conservé. Résultat: la valeur n'est pas convertie.

Donc, ce qui se passe probablement, c'est que vous utilisez un clavier arabe pour produire du texte farsi. La solution recommandée est une sorte de normalisation de l'entrée.

Voir ces discussions:

1) https://groups.google.com/forum/embed/?place=forum/persian-computing#!topic/persian-computing/xS-G0qIGS8A

2) https://github.com/Samsung/KnowledgeSharingPlatform/blob/master/sameas/lib/lucene-analyzers-common-5.0.0/org/apache/lucene/analysis/fa/PersianNormalizer.java

3) can't search in farsi text with arabic keyboard on iphone