Ответ 1
WideCharToMultiByte делает наилучшее сопоставление для любых символов, которые не поддерживаются указанным набором символов, включая удаление диакритики. Вы можете сделать именно то, что хотите, используя это и пропустив 20127 (US-ASCII) в качестве кодовой страницы.
function BestFit(const AInput: AnsiString): AnsiString;
const
CodePage = 20127; //20127 = us-ascii
var
WS: WideString;
begin
WS := WideString(AInput);
SetLength(Result, WideCharToMultiByte(CodePage, 0, PWideChar(WS),
Length(WS), nil, 0, nil, nil));
WideCharToMultiByte(CodePage, 0, PWideChar(WS), Length(WS),
PAnsiChar(Result), Length(Result), nil, nil);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(BestFit('aÀàËëÇç–—€¢Š'));
end;
Призыв к тому, что с вашими примерами вы получаете результаты, которые вы ищете, в том числе случай emdash-to-minus, который, как я полагаю, не обрабатывается предложением Jeroen, чтобы преобразовать в форму нормализации D. Если вы хотите принять это Майкл Каплан имеет сообщение в блоге в явном виде обсуждается снятие диакритики (а не нормализация вообще), но она использует С# и API, который вводит в Vista. Вы можете получить что-то подобное с помощью FoldString api (любой выпуск WinNT).
Конечно, если вы делаете это только для одного набора символов, и вы хотите избежать накладных расходов от преобразования в и из WideString, Padu правильно, что простой цикл и таблица поиска будут столь же эффективными.