Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» AnsiCompareText

Автор: NickNNN
Дата сообщения: 29.07.2016 12:01
Добрый день

Вот столкнулся с проблемой на одном из компьютеров клиента:

AnsiCompareText( AnsiUpperCase('Штульп'), AnsiUpperCase('ШТУЛЬП')) дает 0 (т.е. верно работает)
AnsiCompareText( 'Штульп', 'ШТУЛЬП') дает -1

Какие у кого будут идеи? Кроме как везде менять в коде AnsiCompareText на свою функцию

Спасибо

P.S. Delphi XE3
Автор: KDPoid
Дата сообщения: 29.07.2016 13:53
Если я заглядываю в своей 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;
Автор: NickNNN
Дата сообщения: 02.08.2016 10:14

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


Тоже так думал. Но все стандартно, у меня работает как положено, у клиента - нет.

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

Решил так:


Код:
Function vsSameText(s1, s2: string): boolean;
begin

result := AnsiCompareStr(AnsiUpperCase(s1), AnsiUpperCase(s2)) = 0;

end;
Автор: KDPoid
Дата сообщения: 02.08.2016 21:13

Цитата:

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

 Тоже так думал. Но все стандартно,
Автор: asutp2
Дата сообщения: 02.08.2016 23:04
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] + '>');
Автор: ne_viens
Дата сообщения: 03.08.2016 09:29
У клиента скорее всего Украинская локаль, и мягкий знак не совпадает.
Автор: NickNNN
Дата сообщения: 03.08.2016 16:17
Тест в итоге проводился именно с константами.
AnsiCompareText( 'Штульп', 'ШТУЛЬП');
Функция возвращала -1.

Какая у клиента локаль узнаю позже. Стоит Windows Server 2008 русский

А почему тогда AnsiCompareStr( AnsiUpperCase('Штульп'), AnsiUpperCase('ШТУЛЬП')) - работает?
Или AnsiCompareStr( AnsiUpperCase('Штульп'), AnsiUpperCase('ШТУЛЬП')) <> AnsiCompareText( 'Штульп', 'ШТУЛЬП') ?
Автор: KDPoid
Дата сообщения: 03.08.2016 19:08
Похоже, ne_viens что-то знает про мягкий знак в украинской локали...

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

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

В любом случае, код, который предлагает asutp2 может прояснить причины.
Выполните его у клиента, глядишь, и мир станет понятнее...

Автор: ne_viens
Дата сообщения: 03.08.2016 19:19
Это из-за глюка в CompareStringW();
Все выше названные функции являются её производными.
Причём глюк этот наблюдается только в Win7 и Srv2008R2,
в XP, Win8, Win10, Srv2012R2 Ь и ь одинаковые при NORM_IGNORECASE в UA локали.
Автор: lormutryas
Дата сообщения: 04.08.2016 05:10
в потолке открылся люк,
не пугайся - это глюк
(с) колыбельная экипажа подводной лодки
Автор: NickNNN
Дата сообщения: 04.08.2016 10:48

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


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


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


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



Автор: ne_viens
Дата сообщения: 04.08.2016 19:16

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


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

Страницы: 1

Предыдущая тема: liquibase bestpractices


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.