6

我得到的一些字符串是 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.'
?>

我怎么能在德尔福做到这一点?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 回答