Я нашел функцию Windows API, которая выполняет "естественное сравнение" строк. Он определяется следующим образом:
int StrCmpLogicalW(
LPCWSTR psz1,
LPCWSTR psz2
);
Чтобы использовать его в Delphi, я объявил это так:
interface
function StrCmpLogicalW(psz1, psz2: PWideChar): integer; stdcall;
implementation
function StrCmpLogicalW; external 'shlwapi.dll' name 'StrCmpLogicalW';
Поскольку он сравнивает строки Unicode, я не уверен, как это назвать, когда я хочу сравнить строки ANSI. Кажется, что этого достаточно, чтобы передавать строки в WideString, а затем в PWideChar, однако я не знаю, правильный ли этот подход:
function AnsiNaturalCompareText(const S1, S2: string): integer;
begin
Result := StrCmpLogicalW(PWideChar(WideString(S1)), PWideChar(WideString(S2)));
end;
Я очень мало знаю о кодировке символов, так что это причина моего вопроса. Является ли эта функция ОК или мне нужно сначала преобразовать обе сравниваемые строки?