使用delphi 2010替换UTF-8文件中的unicode字符

时间:2012-12-13 21:38:27

标签: delphi delphi-2010

我正在尝试用字符(十进制值65)替换UTF-8文件中的字符(十进制值197)

我可以加载文件并将其放在一个字符串中(尽管可能不需要这样做)

SS := TStringStream.Create(ParamStr1, TEncoding.UTF8);
SS.LoadFromFile(ParamStr1);
//S:= SS.DataString;
//ShowMessage(S);

但是,如何用65替换所有197's,并将其保存为UTF-8?

 SS.SaveToFile(ParamStr2);
 SS.Free;

--------------编辑----------------

reader:= TStreamReader.Create(ParamStr1, TEncoding.UTF8);
 writer:= TStreamWriter.Create(ParamStr2, False, TEncoding.UTF8);

 while not Reader.EndOfStream do
 begin
  S:= reader.ReadLine;
  for I:= 1 to Length(S)  do
  begin
   if Ord(S[I]) = 350 then
   begin
    Delete(S,I,1);
    Insert('A',S,I);
   end;
  end;
  writer.Write(S + #13#10);
 end;

 writer.Free;
 reader.Free;

1 个答案:

答案 0 :(得分:7)

十进制197为十六进制C5,十进制65为十六进制41

C5本身不是有效的UTF-8八位字节,但41是。U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE。因此,我必须假设您实际上是指代Unicode代码点U+0041 LATIN CAPITAL LETTER AU+00C5

C3 85以UTF-8编码为U+004141编码为StringReplace()。要做你想要的,你必须解码UTF-8,替换代码点,然后重新编码回UTF-8。 SS := TStringStream.Create('', TEncoding.UTF8); SS.LoadFromFile(ParamStr1); S := StringReplace(SS.DataString, 'Å', 'A', [rfReplaceAll]); SS2 := TStringStream.Create(S, TEncoding.UTF8); SS2.SaveToFile(ParamStr2); SS2.Free; SS.Free; 可以正常使用,例如:

reader := TStreamReader.Create(ParamStr1, TEncoding.UTF8);
writer := TStreamWriter.Create(ParamStr2, False, TEncoding.UTF8);

while not Reader.EndOfStream do
begin
  S := reader.ReadLine;
  S := StringReplace(S, 'Å', 'A', [rfReplaceAll]);
  writer.WriteLine(S);
end;

writer.Free;
reader.Free;

或者:

U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE

更新:根据其他评论,您似乎并不真正对Unicode代码点U+015E LATIN CAPITAL LETTER S WITH CEDILLA感兴趣,而是在C5 9E中,而是以UTF编码8为Å。如果确实如此,那么在UTF-8数据解码后调用Ş时,只需将StringReplace()替换为S := StringReplace(S, 'Ş', 'A', [rfReplaceAll]);

{{1}}