PHP MySQL проблеми с кодирането на знаци за търсене

Използвам PDO, за да се свържа с MySQL база данни. В моя низ за връзка вече добавих charset=utf8mb4 и всичките ми бази данни и таблици са utf8mb4_unicode_ci, но съм изправен пред проблем.

За да търся записи въз основа на тяхното заглавие в таблица content, използвам кода по-долу:

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

ключовата дума е персийска дума. Сега горният код връща 1 резултат, който е правилен и според очакванията.

Но Ако направя формуляр в моето PHP приложение и въведа СЪЩАТА дума или чрез компютър с macOS/Windows, или като използвам телефон с Android, получавам 0 резултата.

Проследих този проблем и изглежда, че въпреки че думите, въведени от потребителя, изглеждат абсолютно същите като тези, които вече са в базата данни, те всъщност НЕ са същите.

Според този онлайн инструмент кодът на десетичния знак

за سيگنالها е: 1587, 1610, 1711, 1606, 1575, 1604, 1607, 1575

Докато

за سیگنالها е: 1587, 1740, 1711, 1606, 1575, 1604, 1607, 1575

Забелязахте ли разликата? Това е в удебелен шрифт. Всъщност, ако копирате и двете стойности и ги поставите в тук, ще видите разликата за себе си.

Какво мога да направя, за да реша този досаден проблем? Използвам PHP 7 и MariaDB 10.1.


person Vahid Amiri    schedule 06.09.2017    source източник
comment
какъв е кодът на страницата? трябва да е utf-8 и също така трябва да изпълните SET NAMES utf8 след mysql връзка. моля, публикувайте примерен код.   -  person Akam    schedule 06.09.2017
comment
@Akam Това е utf-8 също така горното може да се тества в phpmyadmin. Същите резултати.   -  person Vahid Amiri    schedule 06.09.2017
comment
Добре тогава, това е проблем с клавиатурата, аз също използвам Unikurd (кюрдски сорани) същите букви като персийския и арабския, понякога потребител използва клавиатура, която има различни Unicode обекти от записаните в базата данни, но ние решихме този проблем чрез замяна на буквите с общ.   -  person Akam    schedule 06.09.2017
comment
@Akam, Как мога да ги заменя с обичайните знаци? Кои са често срещаните знаци?   -  person Vahid Amiri    schedule 06.09.2017
comment
Общите символи са тези, които обикновено се използват от потребителите, зависи от клавиатурната подредба, която се използва от повече потребители, първият y е ي, докато вторият ви y е ی, които са много различни в своите Unicode стойности, заменете един от тях с общия г.   -  person Akam    schedule 06.09.2017
comment
Това може да е проблем със съпоставянето, при който базата данни не може да определи кои знаци или комбинации от знаци са еквивалентни.   -  person tadman    schedule 06.09.2017
comment
@Akam, прав си, ако можеш да напишеш това като отговор, бих могъл да го приема. Проблемът всъщност беше ي, който беше записан в базата данни, докато трябваше да бъде ی   -  person Vahid Amiri    schedule 06.09.2017
comment
Има ли езикова или друга разлика между двете YEH? Те изглежда се съпоставят по различен начин, дори с utf8mb4_unicode_520_ci. (Тоест Unicode 5.20 твърди, че те трябва да се третират като различни знаци.)   -  person Rick James    schedule 06.09.2017
comment
@RickJames Няма разлика. Единият се използва на арабски, докато другият се използва изключително на персийски. Обикновено те са доста очевидни и не са трудни за разграничаване, но в този контекст са разположени в средата на думата и са свързани с други знаци, което прави невъзможно да забележите разликата само като ги погледнете.   -  person Vahid Amiri    schedule 07.09.2017


Отговори (2)


Вашето първо "ي" в думата "سيگنالها" е различен знак от втората дума "سیگنالها", която е "ی"

Първо ي: е АРАБСКАТА БУКВА YEH (U+064A)

Второ ی: е АРАБСКА БУКВА ФАРСИ YEH (U+06CC)

Те са различни в своите Unicode обекти, така че не съвпадат. Моля, вижте https://www.key-shortcut.com/en/writing-systems/%EF%BA%95%EF%BA%8F%D8%A2-arabic-alphabet/ за повече информация .

person Akam    schedule 06.09.2017

Те не са един и същ знак, въпреки че изглеждат еднакви, когато са нанизани заедно и може дори да имат същото значение.

Първият низ (1610) е АРАБСКА БУКВА ФАРСИ YEH[1], докато другият (1740) е АРАБСКА БУКВА YEH[2].

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

Също така създадох проста форма за PHP и тествах и двата низа, за да видя дали стойността, изпратена чрез $_POST, се запазва. Резултат: стойността не е преобразувана.

Това, което вероятно се случва, е, че използвате арабска клавиатура, за да създадете текст на фарси. Препоръчителното решение е някакъв вид нормализиране на входа.

Вижте тези дискусии:

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) не може да търси в текст на фарси с арабска клавиатура на iphone

person Andrei    schedule 06.09.2017