Форум: "Прочее";
Текущий архив: 2012.02.19;
Скачать: [xml.tar.bz2];
ВнизUTF-8 сравнение строк без учета регистра??? Найти похожие ветки
← →
GreyWolf83 (2011-11-02 22:51) [0]Кто-нибудь знает, существуют ли исходники (или функция Windows API, начиная с 2000), которые могут быть скомпилированы в Delphi 7, для регистро-независимого (case-insensitive) сравнения двух UTF-8 строк (без предварительного перевода в UTF-16, разумеется)? Разумеется, нужно, чтобы работало для символов на любом языке, т.е. символов с любым Unicode-кодом.
Я пока нахожу только что-то похожее на C/C++.
← →
Eraser © (2011-11-02 23:16) [1]> [0] GreyWolf83 (02.11.11 22:51)
почему бы не перевести в UTF 16?
← →
KilkennyCat © (2011-11-02 23:27) [2]
> Eraser © (02.11.11 23:16) [1]
возможно, динамик компа тому препятствие, точнее, писк его, при переводе строк раздающийся, мерзкий.
← →
Dimka Maslov © (2011-11-03 07:52) [3]Если посмотреть в справку для функций сравнения строк, то нам по русски написано "this function works with multibyte character sets"
← →
QAZ (2011-11-03 09:55) [4]попробуй StrCmpI
> Dimka Maslov © (03.11.11 07:52) [3]
multibyte character sets это обычные ANSI строки
← →
GreyWolf © (2011-11-03 10:20) [5]
> Eraser © (02.11.11 23:16) [1]
> > [0] GreyWolf83 (02.11.11 22:51)почему бы не перевести
> в UTF 16?
> KilkennyCat © (02.11.11 23:27) [2]
> > Eraser © (02.11.11 23:16) [1]возможно, динамик компа
> тому препятствие, точнее, писк его, при переводе строк раздающийся,
> мерзкий.
Да, правильно, на наших форумах обязательно нужно прежде всего объяснить автору вопроса, какой он идиот.
А потом люди удивляются, почему уровень форума падает.
Неудобно там перводить в UTF-16, а потом обратно, да и некрасиво.
А MBCS - это про частично-двухбайтовые кодировки, это НЕ UTF-8.
← →
GreyWolf © (2011-11-03 10:20) [6]
> Eraser © (02.11.11 23:16) [1]
> > [0] GreyWolf83 (02.11.11 22:51)почему бы не перевести
> в UTF 16?
> KilkennyCat © (02.11.11 23:27) [2]
> > Eraser © (02.11.11 23:16) [1]возможно, динамик компа
> тому препятствие, точнее, писк его, при переводе строк раздающийся,
> мерзкий.
Да, правильно, на наших форумах обязательно нужно прежде всего объяснить автору вопроса, какой он идиот.
А потом люди удивляются, почему уровень форума падает.
Неудобно там перводить в UTF-16, а потом обратно, да и некрасиво.
А MBCS - это про частично-двухбайтовые кодировки, это НЕ UTF-8.
← →
Anatoly Podgoretsky © (2011-11-03 10:21) [7]> QAZ (03.11.2011 09:55:04) [4]
Это не ANSI хотя их включают
← →
GreyWolf © (2011-11-03 10:31) [8]Предыдущий дубль - мой. Глючит то ли сайт, то ли у меня что-то.
Перенос топика в "Прочее" - это сильно. Дикий такой оффтоп, с программированием на Delphi тема не связана ну никак.
← →
GreyWolf © (2011-11-03 10:33) [9]Вопрос задавал я под ником GreyWolf83, забыл пароль от зарегистрированного ника.
← →
Inovet © (2011-11-03 10:53) [10]> [9] GreyWolf © (03.11.11 10:33)
> забыл пароль от зарегистрированного ника.
Так эта. Восстановить же можно.
← →
RTFM (2011-11-03 11:15) [11]За несколько месяцев задавания этого вопроса на всех форумах подряд уже можно было бы осознать ответ "НЕТ".
← →
Eraser © (2011-11-03 12:55) [12]> [6] GreyWolf © (03.11.11 10:20)
> какой он идиот.
> Неудобно там перводить в UTF-16, а потом обратно, да и некрасиво.
неудобно, когда дети на соседа похожи )
← →
Anatoly Podgoretsky © (2011-11-03 13:06) [13]Без перевода в UTF-16 данная операция не реальна.
← →
Mystic © (2011-11-03 13:11) [14]А причем вообще UTF16? Имелось в виду UCS-2?
Ну а так, любое сравнение привязано к локали.
← →
GreyWolf © (2011-11-03 14:42) [15]
> Anatoly Podgoretsky © (03.11.11 13:06) [13]
> Без перевода в UTF-16 данная операция не реальна.
Вот есть библиотека, которая позволяет это делать:
http://icu-project.org/apiref/icu4c/classCollator.html
http://userguide.icu-project.org/strings/utf-8
Но она на С++
Ищу то же для Delphi
← →
Омлет © (2011-11-03 15:14) [16]Fundamentals Unicode ( http://fundementals.sourceforge.net/ ) - там есть WideIsEqualNoCase.
← →
Cobalt © (2011-11-03 15:21) [17]
> GreyWolf © (03.11.11 14:42) [15]
> > Anatoly Podgoretsky © (03.11.11 13:06) [13]
> > Без перевода в UTF-16 данная операция не реальна.
> Вот есть библиотека, которая позволяет это делать:
> http://icu-project.org/apiref/icu4c/classCollator.html
> http://userguide.icu-project.org/strings/utf-8
Так и вы говорите, что можете за ночь 5 раз.
← →
RTFM (2011-11-03 15:34) [18]
> Вот есть библиотека, которая позволяет это делать:
> http://icu-project.org/apiref/icu4c/classCollator.html
> http://userguide.icu-project.org/strings/utf-8
> Но она на С++
*facepalm*
Что делает твой compareUTF8 первым действием? Правильно, переводит обе строки в UTF-16. А потом вызывает compare для сравнения двух UTF-16 строк.
← →
RWolf © (2011-11-03 16:02) [19]
> [18]
ну и правильно, зачем усложнять.
← →
GreyWolf © (2011-11-03 17:12) [20]
> *facepalm*Что делает твой compareUTF8 первым действием?
> Правильно, переводит обе строки в UTF-16. А потом вызывает
> compare для сравнения двух UTF-16 строк.
Он этого не делает. Итерация происходит по исходным UTF-8 строкам. Как я понял из беглого просмотра исходников, перевод в UTF-16 там действительно есть, но по символу за раз и до первого встреченного различия - а это несколько другое, чем первоначальный перевод в UTF-16 ВСЕЙ строки сразу.
Нашел еще обертку Pascal/Delphi к этой библиотеке - http://www.crossgl.com/icu4pas/, но она требует наличия DLL собственно бибилиотеки, чего не хочется включать в проект.
> Fundamentals Unicode ( http://fundementals.sourceforge.net/
> ) - там есть WideIsEqualNoCase.
Спасибо, хоть один конструктивный ответ. Это правда для символов, а не строк, но похоже наиболее простой вариант - написать свою функцию, перебирающую символы в исходных UTF-8 строках, с вызовом этой функции в цикле.
← →
QAZ (2011-11-03 17:16) [21]Удалено модератором
← →
RTFM (2011-11-03 18:27) [22]Так бы и спрашивал - как перебрать UTF-8 строку по символу за раз. В том же JCL есть UTF8GetNextChar.
← →
sniknik © (2011-11-03 19:05) [23]> а это несколько другое, чем первоначальный перевод в UTF-16 ВСЕЙ строки сразу.
да, это гораздо медленнее чем все за раз... или быстрее... смотря на вероятности результата - полное совпадение/отказ в конце, или несовпадение в первых же в символах.
← →
GreyWolf © (2011-11-03 19:54) [24]
> sniknik © (03.11.11 19:05) [23]
> > а это несколько другое, чем первоначальный перевод в UTF-
> 16 ВСЕЙ строки сразу.да, это гораздо медленнее чем все за
> раз... или быстрее... смотря на вероятности результата -
> полное совпадение/отказ в конце, или несовпадение в первых
> же в символах.
Специфика задачи такая, что это поиск вхождения подстроки в строку и замена на новое значение найденных вхождений. В каждой позиции строки проверяется начало паттерна (решение "в лоб", без применения оптимизированных алгоритмов Бойера-Мура и др.). Соответственно в подавляющем большинстве случаев первые же символы образца и сравниваемой строки различаются. Тут либо переводить весь текст строки, в которой производится поиск, вместе с образцом, в UTF-16 до его начала, а потом весь текст строки - обратно, либо -- только по одному символу, как я хотел.
В общем, всем спасибо, реализовал свою функцию с использованием Utf8ToUnicode посимвольно (для каждого исходного UTF-8 символа, размером 1--5 байт), и WideIsEqualNoCase.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2012.02.19;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.005 c