我正在尝试将UTF-8文件中的字符(十进制值197)替换为字符(十进制值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;
发布于 2012-12-13 23:02:04
十进制197
是十六进制的C5
,十进制的65
是十六进制的41
。
C5
本身不是有效的UTF8二进制八位数,但41
是。因此,我不得不假设您实际上是指Unicode代码点U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE
和U+0041 LATIN CAPITAL LETTER A
。
U+00C5
在UTF8中被编码为C3 85
,U+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代码点U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE
不感兴趣,而是对U+015E LATIN CAPITAL LETTER S WITH CEDILLA
感兴趣,它在UTF8中编码为C5 9E
。如果是这样,那么在解码UTF-8数据后调用StringReplace()
时,只需将Å
替换为Ş
即可:
S := StringReplace(S, 'Ş', 'A', [rfReplaceAll]);
https://stackoverflow.com/questions/13868914
复制