我得到的一些字符串是UTF-8编码的,并包含一些特殊字符,如
Å¡,Ä',Ä等我正在使用StringReplace()
将其转换为一些普通文本,但我只能转换一种类型的字符。因为PHP还有一个替换字符串的函数,如下所示:how to replace special characters with the ones they're based on in 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
不支持数组。
答案 0 :(得分: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
);
答案 1 :(得分:6)
删除您的口音称为Normalization。
由于您使用的是Unicode,因此您不仅需要规范化问题中重音字符的短列表。事实上,您正在寻找Unicode Normalization Form D(NFD)或KD(NFKD),您可以在Windows中进行,当然也可以在Delphi中进行。
This answer应该让你进入理论方面。
This Delphi code和this answer可以帮助您实施。