Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.02.19;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.013 c
15-1319715427
Бездомный
2011-10-27 15:37
2012.02.19
Как лучше называть ключевое (и не только) поля таблиц?


15-1320052005
И. Павел
2011-10-31 12:06
2012.02.19
Использование одной связки таблиц несколько раз в одном запросе.


6-1247641927
diizell
2009-07-15 11:12
2012.02.19
NewCamD 5.25


15-1319830330
ваще
2011-10-28 23:32
2012.02.19
Программист, кто он?


15-1316790219
Rouse_
2011-09-23 19:03
2012.02.19
Выбираем очередных претендентов на знак "Мастер Дельфи"