我正在尝试用字符(十进制值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;
答案 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 A
和U+00C5
。
C3 85
以UTF-8编码为U+0041
,41
编码为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}}