Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1320748521
bam
2011-11-08 13:35
2012.02.19
Файл уже открыт 107


15-1319445988
OW
2011-10-24 12:46
2012.02.19
java + t-sql vs Delphi+ t-sql. На сколько сложно туда-сюда перекл


11-1215359585
NikFel
2008-07-06 19:53
2012.02.19
Как убрать HScroll в TkolListView.


2-1320829589
RGV
2011-11-09 13:06
2012.02.19
Картотека - С чего начать?


2-1320868060
Max
2011-11-09 23:47
2012.02.19
как присвоить radiobutton к radiogrup





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский