Изменить специальные символы в массиве Delphi - PullRequest
6 голосов
/ 06 июля 2011

Некоторые строки, которые я получаю, имеют кодировку UTF-8 и содержат некоторые специальные символы, такие как Å¡, Ä ‘, Ä и т. Д. Я использую StringReplace(), чтобы преобразовать его в обычный текст, но я могу преобразовать только один тип символов. Поскольку PHP также имеет функцию для замены строк, как показано здесь: как заменить специальные символы теми, на которых они основаны в PHP? , но он поддерживает массивы:

<?php
  $vOriginalString = "¿Dónde está el niño que vive aquí? En el témpano o en el iglú. ÁFRICA, MÉXICO, ÍNDICE, CANCIÓN y NÚMERO.";

  $vSomeSpecialChars = array("á", "é", "í", "ó", "ú", "Á", "É", "Í", "Ó", "Ú", "ñ", "Ñ");
  $vReplacementChars = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U", "n", "N");

  $vReplacedString = str_replace($vSomeSpecialChars, $vReplacementChars, $vOriginalString);

  echo $vReplacedString; // outputs '¿Donde esta el nino que vive aqui? En el tempano o en el iglu. AFRICA, MEXICO, INDICE, CANCION y NUMERO.'
?>

Как я могу сделать это в Delphi? StringReplace не поддерживает массивы.

Ответы [ 2 ]

6 голосов
/ 06 июля 2011

Избавление от ваших акцентов называется Нормализация .

Поскольку вы используете Unicode, вы не только хотите нормализовать краткий список символов с акцентами в вашем вопросе.На самом деле вы ищете Unicode Форма нормализации D (NFD) или KD (NFKD), которую вы можете сделать в Windows и, конечно, в Delphi.

Этот ответ должен помочь вам перейти к теоретической стороне.

Этот код Delphi и этот ответ должны помочь вам приступить к реализации.

6 голосов
/ 06 июля 2011
function str_replace(const oldChars, newChars: array of Char; const str: string): string;
var
  i: Integer;
begin
  Assert(Length(oldChars)=Length(newChars));
  Result := str;
  for i := 0 to high(oldChars) do
    Result := StringReplace(Result, oldChars[i], newChars[i], [rfReplaceAll])
end;

Если вас беспокоят все ненужные выделения кучи, вызванные StringReplace, вы можете написать это так:

function str_replace(const oldChars, newChars: array of Char; const str: string): string;
var
  i, j: Integer;
begin
  Assert(Length(oldChars)=Length(newChars));
  Result := str;
  for i := 1 to Length(Result) do
    for j := 0 to high(oldChars) do
      if Result[i]=oldChars[j] then
      begin
        Result[i] := newChars[j];
        break;
      end;
end;

Назовите это так:

newStr := str_replace(
  ['á','é','í'],
  ['a','e','i'], 
  oldStr
);
...