Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » AnsiCompareText

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

NickNNN



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день
 
Вот столкнулся с проблемой на одном из компьютеров клиента:
 
AnsiCompareText( AnsiUpperCase('Штульп'), AnsiUpperCase('ШТУЛЬП')) дает 0 (т.е. верно работает)
AnsiCompareText( 'Штульп', 'ШТУЛЬП') дает -1
 
Какие у кого будут идеи? Кроме как везде менять в коде AnsiCompareText на свою функцию
 
Спасибо
 
P.S. Delphi XE3

Всего записей: 156 | Зарегистр. 25-11-2008 | Отправлено: 12:01 29-07-2016
KDPoid



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если я заглядываю в своей xe3 внутрь AnsiCompareText, я вижу там:

Код:
function AnsiCompareText(const S1, S2: string):  
begin
  Result := CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, PChar(S1),
    Length(S1), PChar(S2), Length(S2)) - CSTR_EQUAL;
end;

 
NORM_IGNORECASE позволяет предположить, что заглавные или строчные - ей пофиг.
И у меня именно так:
AnsiCompareText( 'Штульп', 'ШТУЛЬП');
возвращает 0.
 
Может быть у вас есть ещё одна AnsiCompareText, не из System.SysUtils?
Чему равно LOCALE_USER_DEFAULT?
 
 
 

Всего записей: 404 | Зарегистр. 08-08-2006 | Отправлено: 13:53 29-07-2016
NickNNN



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Может быть у вас есть ещё одна AnsiCompareText, не из System.SysUtils?
Чему равно LOCALE_USER_DEFAULT?  

 
Тоже так думал. Но все стандартно, у меня работает как положено, у клиента - нет.
 
Самое интересное - что проблема именно в слове "Штульп". Другие русские слова оно сравнивает нормально и результат ожидаемый. Какой-то глюк именно в системе, нигде больше такого не наблюдаю
 
Решил так:
 

Код:
 
Function vsSameText(s1, s2: string): boolean;
begin
 
  result := AnsiCompareStr(AnsiUpperCase(s1), AnsiUpperCase(s2)) = 0;
 
end;
 

Всего записей: 156 | Зарегистр. 25-11-2008 | Отправлено: 10:14 02-08-2016 | Исправлено: NickNNN, 10:18 02-08-2016
KDPoid



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:

Цитата:
 
Чему равно LOCALE_USER_DEFAULT?  
 

 Тоже так думал. Но все стандартно,  

 
неточно выразился...
LOCALE_USER_DEFAULT - это 0х400
И у вас и у клиента. И оно всегда означает "возьми дефолтовую локаль"
А вот дефолтовые локали у вас не разные случаем? У одно дефолтовая английская, у другого вьетнамская...  
 

Цитата:
Самое интересное - что проблема именно в слове "Штульп"

Т.е. именно код:
AnsiCompareText( 'Штульп', 'ШТУЛЬП');
У пользователя возвращает не 0? Вот так вот, со строками-константами?
Или там всё-таки переменные?
Что-нибудь типа:
AnsiCompareText( sht1, sht2);
Тогда чему равно (length(sht1) = length(sht2)) ?
В смысле, вы уверены, что длина слов одинаковая и туда не затесался невидимый символ?
 

Всего записей: 404 | Зарегистр. 08-08-2006 | Отправлено: 21:13 02-08-2016 | Исправлено: KDPoid, 21:14 02-08-2016
asutp2

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NickNNN, а какая версия Windows у клиента и какая именно активная локаль?  
 
Чтобы проверил я при подобной проблеме:
1. KDPoid правильно замечает про проверку length(sht1) = length(sht2)
2. Возможно из за иной локализации, чем русская, какая то из букв может неверно сравниваться, простым кодом это можно отловить:

Код:
 
s1 := 'Штульп';
s2 := 'ШТУЛЬП';
for I := 1 to Length(s1) do
  if AnsiCompareText(s1[I], s2[I]) <> 0 then
    ShowMessage('<' + s1[I] + '> неверно сравнивается с <' + s2[I] + '>');
 

Всего записей: 785 | Зарегистр. 22-10-2004 | Отправлено: 23:04 02-08-2016
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У клиента скорее всего Украинская локаль, и мягкий знак не совпадает.

Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 09:29 03-08-2016
NickNNN



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Тест в итоге проводился именно с константами.  
AnsiCompareText( 'Штульп', 'ШТУЛЬП');  
Функция возвращала -1.
 
Какая у клиента локаль узнаю позже. Стоит Windows Server 2008 русский
 
А почему тогда AnsiCompareStr( AnsiUpperCase('Штульп'), AnsiUpperCase('ШТУЛЬП')) - работает?  
Или AnsiCompareStr( AnsiUpperCase('Штульп'), AnsiUpperCase('ШТУЛЬП')) <> AnsiCompareText( 'Штульп', 'ШТУЛЬП') ?

Всего записей: 156 | Зарегистр. 25-11-2008 | Отправлено: 16:17 03-08-2016
KDPoid



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Похоже, ne_viens что-то знает про мягкий знак в украинской локали...

Цитата:
Или AnsiCompareStr( AnsiUpperCase('Штульп'), AnsiUpperCase('ШТУЛЬП')) <> AnsiCompareText( 'Штульп', 'ШТУЛЬП')  

Конечно, не равны.
В первом случае вы сравниваете 'Ь' и 'Ь'
Во втором - 'ь' и 'Ь', и всё упирается в реализацию механизма сравнения без учёта регистра.
 
В любом случае, код, который предлагает asutp2 может прояснить причины.
Выполните его у клиента, глядишь, и мир станет понятнее...
 

Всего записей: 404 | Зарегистр. 08-08-2006 | Отправлено: 19:08 03-08-2016
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это из-за глюка в CompareStringW();
Все выше названные функции являются её производными.
Причём глюк этот наблюдается только в Win7 и Srv2008R2,
в XP, Win8, Win10, Srv2012R2  Ь и ь одинаковые при NORM_IGNORECASE в UA локали.

Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 19:19 03-08-2016
lormutryas

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
в потолке открылся люк,
не пугайся - это глюк
(с) колыбельная экипажа подводной лодки

Всего записей: 113 | Зарегистр. 26-07-2014 | Отправлено: 05:10 04-08-2016
NickNNN



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Конечно, не равны.
В первом случае вы сравниваете 'Ь' и 'Ь'
Во втором - 'ь' и 'Ь', и всё упирается в реализацию механизма сравнения без учёта регистра.  

 
Тогда AnsiUpperCase('ь') и AnsiUpperCase('Ь') должны были давать разный результат. В данном случае имеет место именно глюк, а не особенность
 

Цитата:
Это из-за глюка в CompareStringW();
Все выше названные функции являются её производными.
Причём глюк этот наблюдается только в Win7 и Srv2008R2,
в XP, Win8, Win10, Srv2012R2  Ь и ь одинаковые при NORM_IGNORECASE в UA локали.  

 
Спасибо, так и есть.
 
 
 

Всего записей: 156 | Зарегистр. 25-11-2008 | Отправлено: 10:48 04-08-2016
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
в потолке открылся люк,
не пугайся - это глюк
(с) колыбельная экипажа подводной лодки  

 
Глюк, я твой отец.
(с) Билл Вейдер

Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 19:16 04-08-2016
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » AnsiCompareText


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru