首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用delphi 2010替换UTF-8文件中的unicode字符

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

Stack Overflow用户
提问于 2012-12-14 05:38:27
回答 1查看 3K关注 0票数 1

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

我可以加载文件并将其放入字符串中(但可能不需要这样做)

代码语言:javascript
代码运行次数:0
运行
复制
SS := TStringStream.Create(ParamStr1, TEncoding.UTF8);
SS.LoadFromFile(ParamStr1);
//S:= SS.DataString;
//ShowMessage(S);

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

代码语言:javascript
代码运行次数:0
运行
复制
 SS.SaveToFile(ParamStr2);
 SS.Free;

-编辑

代码语言:javascript
代码运行次数:0
运行
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-14 07:02:04

十进制197是十六进制的C5,十进制的65是十六进制的41

C5本身不是有效的UTF8二进制八位数,但41是。因此,我不得不假设您实际上是指Unicode代码点U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVEU+0041 LATIN CAPITAL LETTER A

U+00C5在UTF8中被编码为C3 85U+0041被编码为41。要执行您所要求的操作,必须对UTF-8进行解码,替换码点,然后重新编码为UTF-8。对于这一点,StringReplace()可以很好地工作,例如:

代码语言:javascript
代码运行次数:0
运行
复制
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;

或者:

代码语言:javascript
代码运行次数:0
运行
复制
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()时,只需将Å替换为Ş即可:

代码语言:javascript
代码运行次数:0
运行
复制
S := StringReplace(S, 'Ş', 'A', [rfReplaceAll]);
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13868914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档