6

取得している文字列の一部はUTF-8でエンコードされており、Å¡、Ä'、Äなどの特殊文字が含まれています。StringReplace()通常のテキストに変換するために使用していますが、変換できる文字は1種類のみです。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アレイをサポートしていません。

4

2 に答える 2

6
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
);
于 2011-07-06T16:23:00.343 に答える
6

アクセントを取り除くことを正規化と呼びます。

Unicodeを使用しているので、質問のアクセント付き文字の短いリストを正規化するだけではありません。実際、あなたはUnicode Normalization Form D(NFD)またはKD(NFKD)を探しています。これは、Windows、そしてもちろんDelphiで実行できます。

この答えはあなたを理論的な側面に向かわせるはずです。

このDelphiコードこの答えにより、実装を開始できます。

于 2011-07-06T17:28:47.583 に答える