Подтвердить что ты не робот

Преобразуйте символы Hi-Ansi в эквивалент Ascii (é → e)

Существует ли в Delphi 2007 подпрограмма для преобразования символов в верхнем диапазоне таблицы ANSI ( > 127) в их эквивалентные в чистом ASCII (< = 127) в соответствии с языковой версией (кодовой страницы)?

Я знаю, что некоторые символы не могут хорошо перевести, но большинство может, особенно. в диапазоне 192-255:

  • À A
  • à a
  • Ë E
  • e
  • Ç C
  • ç c
  • - (en dash) → - (дефис - это может быть сложнее)
  • - (em dash) → - (дефис)
4b9b3361

Ответ 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 правильно, что простой цикл и таблица поиска будут столь же эффективными.

Ответ 2

Просто чтобы продлить ответ Craig для Delphi 2009:

Если вы используете Delphi 2009 и новее, вы можете использовать более читаемый код с тем же результатом:

function OStripAccents(const aStr: String): String;
type
  USASCIIString = type AnsiString(20127);//20127 = us ascii
begin
  Result := String(USASCIIString(aStr));
end;

К сожалению, этот код работает только в MS Windows. На Mac акценты не заменяются лучшими символами, а вопросительными знаками.

Очевидно, что Delphi внутренне использует WideCharToMultiByte в Windows, тогда как на Mac iconv используется (см. LocaleCharsFromUnicode в System.pas). Вопрос в том, следует ли рассматривать это поведение на разных ОС как ошибку и сообщать CodeCentral.

Ответ 3

Я считаю, что ваш лучший выбор - создание таблицы поиска.