Символы "ي" и "ی" и разница в персидском - Mysql - PullRequest
41 голосов
/ 11 апреля 2011

Я работаю над персидским сайтом UTF-8 со встроенной базой данных mysql.Весь контент на сайте импортируется через панель администратора, и все это на персидском языке.

Как вы, наверное, знаете, арабский язык имеет те же буквы, что и персидский, за исключением некоторых.Проблема в том, что когда человек пытается набрать на клавиатуре с арабской раскладкой, он пишет «ي» как символ, а если он пытается набрать на клавиатуре с персидской раскладкой, он набирает «ی» как символ.

Таким образом, если человек ищет «بازی», mysql не найдет «بازي» в качестве результата.

Важное примечание: «ی» - не единственный символ с этимсобственности, их много, и они очень похожи.

Как я могу решить эту проблему?

Одно простое наивное решение , кажется, заменяет все "ي" на "ی" перед импортом данных в базу данных, но я ищу более надежное решение, чем это.

Ответы [ 8 ]

30 голосов
/ 31 мая 2011

Уважаемый EBAG, у нас есть один арабский блок в Unicode , который содержит как арабский, так и персидский символы.

06CC - персидский ی и 064A - арабский ي

Клавиатура Windows по умолчанию использует code page 1256 для арабских символов, для которых 064A по умолчанию ي для пользователей как на арабском, так и на арабском, потому что арабские пользователи гораздо больше, чем персидские.

ISIRI создайте стандартную клавиатуру ISIRI 9147 и нанесите на нее арабский и персидский Yeh, но символы Perisan ی по умолчанию. Персидские пользователи, использующие стандартную клавиатуру, будут помещать (и использовать) стандартную персидскую ی‍ while the rest of them use arabic ي`.

Как вы обычно говорили, когда мы сохраняем данные в базу данных, мы меняем арабский ي на персидский ‍ی, и когда мы читаем из него, мы просто выбираем персидский, так что все верно.

Второй подход заключается в использовании файла JavaScript в веб-приложении для управления пользовательским вводом. большинство персидских сайтов используют этот подход для сохранения символов в базе данных. В этом методе пользователю не нужно устанавливать раскладку клавиатуры для персидской или арабской клавиатуры. Он / она просто положил клавиатуру на English, а затем в JavaScript разработчик файла проверил, какой символ ему эквивалентен. Здесь вы можете найти ISIRI 9147 javascript для веб-приложения и персидский гид для его использования.

Третий подход заключается в использовании экранной клавиатуры, которая работает так же, как и предыдущая, с пользовательским интерфейсом и обычно подходит для тех, кто не знаком с персидской клавиатурой.

Четвертый подход заключается в поиске обоих диалектов. Как вы знаете, когда вы устанавливаете MySql или SQL Server, вы можете установить collation, а также у вас есть возможность поддерживать диалект (и чувствительность к регистру). если вы включите арабскую сортировку с диалектом, вы можете получить результат для них обоих, и обычно это отлично работает в sql server, я не проверяю его в MySql. Это пока лучшее решение.

но на вашем месте я реализую простой sql function, который получает nvarchar и возвращает nvarchar. тогда я звоню, когда хочу записать данные. и всякий раз, когда вы хотите прочитать, вы можете пойти на стандартный.

Извините за длинный хвост.

12 голосов
/ 05 августа 2013
update TABLENAME set COLUMNNAME=REPLACE(COLUMNNAME,NCHAR(1610),NCHAR(1740))

или

update TABLENAME set COLUMNNAME=REPLACE(COLUMNNAME,'ي',N'ی')
3 голосов
/ 30 мая 2011

Первая буква (ي) - это Ях в арабском алфавите.Вторая буква (ی) - это вы в персидско-арабском алфавите.

Подробнее о персидско-арабском алфавите здесь: http://en.wikipedia.org/wiki/Perso-Arabic_alphabet

"В последней букве убраны две точки (ی). Арабский язык дифференцирует окончательный yāʾ с двумя точками и alif maxsura (за исключением египетского арабского), который написан как окончательный yāʾ без двух точек.

Поскольку персид опускает две точки в последнем йе,алиф максура нельзя отличить от обычного финала йе. Например, имя Муса (Моисей) пишется موسی. В последнем письме на языке муся персидский язык не делает различий между тобой или алиф максура. "

Кажется, интересная проблема ...

3 голосов
/ 11 апреля 2011

Это называется сопоставлением. Это то, что MySQL использует для сравнения двух разных символов. Боюсь, я ничего не знаю о персидском или арабском, но концепция та же самая. По сути, у вас есть два символа, которые отображаются на одно и то же базовое значение. Вам нужно найти сопоставление, которое отображает ي в ی. Боюсь, это настолько полезно, насколько я могу, не зная больше о языке.

2 голосов
/ 11 января 2012

Я боролся с подобной ситуацией 5-6 лет назад, когда Lucene не был опцией для MySQL, и не было никакого Sphinx (никогда не пробовал Sphinx, но я обнаружил, что большая частьвозможные чередования и положить их в массив в PHP.Так что, если ключевое слово ввода содержало какой-либо из этих символов, я сгенерировал все возможные варианты этого.

Так что для ввода 'بازی' я бы сгенерировал {'بازي', 'بازی'}, а затем я бы запросил MySQL для обоих, как самый простой запрос ниже:

SELECT title,Describtion FROM Games WHERE Description LIKE '%بازي%' OR Description LIKE '%بازی%' 

Основной список альтернатив не очень длинный.

1 голос
/ 13 ноября 2014

Я знаю, что отвечать на эту тему - все равно, что выкапывать труп из могилы, поскольку он действительно старый, но я хотел бы поделиться своим опытом. ИМХО, лучший способ - обернуть ваш запрос и применить замену.это более портативный, чем другие способы.Вот пример Java

public class FarsiRequestWrapper extends HttpServletRequestWrapper{

@Override
public String getParameter(String name) {
    String parameterValue = super.getParameter(name);
    parameterValue.replace("ی", "ي");       
    parameterValue.replace("\\s+", " ");
    parameterValue.replace("ک","ک");
    return parameter.trim();
}

}

, тогда вам нужно только настроить сервлет фильтра

public class FarsiFilter implements Filter{

public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {

    HttpServletRequest req = (HttpServletRequest) request;
    FarsiRequestWrapper rw = new FarsiRequestWrapper(req);
    chain.doFilter(rw, response);
}

}, хотя этот подход работает только в Java, я обнаружил,это проще и лучше.

1 голос
/ 27 мая 2011

Если у вас есть возможность переключать движок БД, вы можете изучить возможности полнотекстового поиска в PostgreSQL:

http://www.postgresql.org/docs/9.0/static/textsearch.html

Помимо прочего, вы можете настроитьэто так, что он индексирует / ищет символы без акцента, и вы можете определить все виды дополнительных словарей (например, стоп-слова, тезаурус, синонимы и т.или Lucene вместо like операторов для ваших поисков.

0 голосов
/ 25 сентября 2016

Вы должны использовать 'N перед символом замены, например:
Replace (ColumnName, N 'ي', N 'ی')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...