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;
Calling, что с примерами дает результаты, которые вы ищете, включая случай emdash-к-минус, который я не думаю, что обрабатывается предложение Jeroen, чтобы преобразовать в нормализации формы D. Если вы сделали хочу воспользоваться этим подходом, у Майкла Каплана есть blog post, в котором явно обсуждаются дезапиляционные диакритики (а не нормализация вообще), но он использует C# и API, который вводится в Vista. Вы можете получить что-то подобное, используя FoldString api (любой выпуск WinNT).
Конечно, если вы делаете это только для одного набора символов, и вы хотите избежать накладных расходов от преобразования в WideString и из него, Padu правильно, что простой цикл и таблица поиска будут столь же эффективны ,
Спасибо Крэйг. Это более общее решение, чем поиск. У него была опечатка в магическом числе, поэтому я исправил ее и использовал вместо нее константу. Но в любом случае, он работает на D2007, а также на D2009. –
Одна вещь, которую мы заметили с этим, заключается в том, что 'β' (unicode 1E9E latin заглавная буква sharp s) не преобразуется, поэтому мы делаем это заранее: StringReplace (aStr, 'β', 'SS', [rfReplaceAll]) – PatrickvL