1

UTF-8 ファイルの文字 (10 進値 197) を文字 (10 進値 65) に置き換えようとしています。

ファイルを読み込んで文字列に入れることができます(ただし、そうする必要はないかもしれません)

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

ただし、すべての 197 を 65 に置き換えて、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;
4

1 に答える 1

7

10 進数197は 16 進数C5、10 進数65は 16 進数41です。

C5それ自体では有効な UTF-8 オクテットではありませんが、有効です41。したがって、実際には Unicode コードポイントを参照していると想定する必要がU+00C5 LATIN CAPITAL LETTER A WITH RING ABOVEありU+0041 LATIN CAPITAL LETTER Aます。

U+00C5は として UTF-8 でエンコードされC3 85U+0041としてエンコードされ41ます。求めていることを行うには、UTF-8 をデコードし、コードポイントを置き換えてから、UTF-8 に再エンコードする必要があります。 StringReplace()たとえば、次のようにします。

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;

更新:他のコメントに基づいて、実際には Unicode codepoint に興味がないように見えますがU+00C5 LATIN CAPITAL LETTER A WITH RING ABOVEU+015E LATIN CAPITAL LETTER S WITH CEDILLA代わりに、UTF-8 でエンコードされているC5 9E. その場合は、UTF-8 データがデコードされた後に呼び出すときに、次Åのように置き換えます。ŞStringReplace()

S := StringReplace(S, 'Ş', 'A', [rfReplaceAll]);
于 2012-12-13T23:02:03.577 に答える