Проблемы с кодировкой символов поиска 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)

Второй ی: АРАБСКАЯ БУКВА ФАРСИ ЙЕ (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) — АРАБСКАЯ БУКВА ФАРСИ ЙЕ[1], а другая (1740) — АРАБСКАЯ БУКВА ЙЕ[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) не может выполнять поиск в тексте на фарси с арабской клавиатурой на айфоне

person Andrei    schedule 06.09.2017