关于UTF-8保存的问题。

m0_37551303 2017-02-20 07:43:39
小弟有个INI文件是UTF-8格式编码的。现在想用Delphi做一个参数的修改。在网上找到一个例句。可是小弟我不知道怎么用到WriteString里?请打什么帮忙修改一下



var f: TextFile;
begin
AssignFile(f, 'test.txt');
Rewrite(f);
write(f, #$EF+#$BB+#$BF); // UTF-8 BOM,关键就是写入这个UTF-8的BOM, BOM 是 Bype Order Mark 的缩写。
writeln(f, UTF8Encode('中文'));
CloseFile(f);
...全文
431 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝色光芒 2017-02-21
  • 打赏
  • 举报
回复
var
  ini : TMemIniFile;
  sBuf , sName : String;
  FM : TFileStream;
  bIsUTF : Boolean;
begin
  //这一段 获取一个临时文件路径和名称,存到变量sName中
  SetLength(sName, MAX_PATH);
  FillChar(Pointer(sName)^ , MAX_PATH, 0);
  Windows.GetTempPath(MAX_PATH, Pointer(sName));
  sName := Trim(sName) + 'temp_1.0.ini';

  //这一段读取要修改的ini文件,存到变量sBuf中
  FM := TFileStream.Create('e:\d.ini' , fmOpenRead);
  if FM.Size=0 then begin
    FM.Free;
    exit;
  end;
  SetLength(sBuf, FM.Size);
  FM.Read(Pointer(sBuf)^, FM.Size);
  FM.Free;

  //判断是否是UTF-8字符集,如果是转换成String字符(Delphi7默认为Ansi字符集)
  bIsUTF := Copy(sBuf , 1 , 3) = #$EF#$BB#$BF;
  if bIsUTF then begin
    Delete(sBuf , 1 , 3);
    sBuf := UTF8Decode(sBuf);
  end;

  //把转换好的字符集保存到临时文件中
  FM := TFileStream.Create(sName, fmCreate);
  FM.WriteBuffer(Pointer(sBuf)^ , Length(sBuf));
  FM.Free;

  //修改ini文件的内容***********************
  ini := TMemIniFile.Create(sName);
  ini.WriteString('sys', 'Name' , 'V汉字文才能体现UTF8lue');
  ini.UpdateFile;  //保存到文件,即临时文件
  ini.Free;

  //读取已经修改并保存的ini文件到字符串sBuf中
  FM := TFileStream.Create(sName, fmOpenRead);
  SetLength(sBuf, FM.Size);
  FM.Read(Pointer(sBuf)^, FM.Size);
  FM.Free;
  DeleteFile(sName);  //删除临时文件

  //转换为UTF-8字符集
  if bIsUTF then begin
    sBuf := UTF8Encode(sBuf);
    sBuf := #$EF#$BB#$BF + sBuf;  //加上BOM
  end;

  //把转换好的字符集,直接覆盖保存到待修改的ini文件中
  FM := TFileStream.Create('e:\d.ini' , fmCreate);
  FM.WriteBuffer(Pointer(sBuf)^ , Length(sBuf));
  FM.Free;
end;
m0_37551303 2017-02-20
  • 打赏
  • 举报
回复
引用 3 楼 kiboisme 的回复:
var
  ini : TMemIniFile;
  sBuf , sName : String;
  FM : TFileStream;
  bIsUTF : Boolean;
begin
  SetLength(sName, MAX_PATH);
  FillChar(Pointer(sName)^ , MAX_PATH, 0);
  Windows.GetTempPath(MAX_PATH, Pointer(sName));
  sName := Trim(sName) + 'temp_1.0.ini';

  FM := TFileStream.Create('e:\d.ini' , fmOpenRead);
  if FM.Size=0 then begin
    FM.Free;
    exit;
  end;
  SetLength(sBuf, FM.Size);
  FM.Read(Pointer(sBuf)^, FM.Size);
  FM.Free;

  bIsUTF := Copy(sBuf , 1 , 3) = #$EF#$BB#$BF;
  if bIsUTF then begin
    Delete(sBuf , 1 , 3);
    sBuf := UTF8Decode(sBuf);
  end;

  FM := TFileStream.Create(sName, fmCreate);
  FM.WriteBuffer(Pointer(sBuf)^ , Length(sBuf));
  FM.Free;

  ini := TMemIniFile.Create(sName);
  ini.WriteString('sys', 'Name' , 'V汉字文才能体现UTF8lue');
  ini.UpdateFile;
  ini.Free;

  FM := TFileStream.Create(sName, fmOpenRead);
  SetLength(sBuf, FM.Size);
  FM.Read(Pointer(sBuf)^, FM.Size);
  FM.Free;
  DeleteFile(sName);

  if bIsUTF then begin
    sBuf := UTF8Encode(sBuf);
    sBuf := #$EF#$BB#$BF + sBuf;
  end;

  FM := TFileStream.Create('e:\d.ini' , fmCreate);
  FM.WriteBuffer(Pointer(sBuf)^ , Length(sBuf));
  FM.Free;
end;
打什么能给点注释么?我不想复制黏贴您的例子。我想自己看看您怎么做到的。我看了半天没看太明白。对了。分给您
蓝色光芒 2017-02-20
  • 打赏
  • 举报
回复
var
  ini : TMemIniFile;
  sBuf , sName : String;
  FM : TFileStream;
  bIsUTF : Boolean;
begin
  SetLength(sName, MAX_PATH);
  FillChar(Pointer(sName)^ , MAX_PATH, 0);
  Windows.GetTempPath(MAX_PATH, Pointer(sName));
  sName := Trim(sName) + 'temp_1.0.ini';

  FM := TFileStream.Create('e:\d.ini' , fmOpenRead);
  if FM.Size=0 then begin
    FM.Free;
    exit;
  end;
  SetLength(sBuf, FM.Size);
  FM.Read(Pointer(sBuf)^, FM.Size);
  FM.Free;

  bIsUTF := Copy(sBuf , 1 , 3) = #$EF#$BB#$BF;
  if bIsUTF then begin
    Delete(sBuf , 1 , 3);
    sBuf := UTF8Decode(sBuf);
  end;

  FM := TFileStream.Create(sName, fmCreate);
  FM.WriteBuffer(Pointer(sBuf)^ , Length(sBuf));
  FM.Free;

  ini := TMemIniFile.Create(sName);
  ini.WriteString('sys', 'Name' , 'V汉字文才能体现UTF8lue');
  ini.UpdateFile;
  ini.Free;

  FM := TFileStream.Create(sName, fmOpenRead);
  SetLength(sBuf, FM.Size);
  FM.Read(Pointer(sBuf)^, FM.Size);
  FM.Free;
  DeleteFile(sName);

  if bIsUTF then begin
    sBuf := UTF8Encode(sBuf);
    sBuf := #$EF#$BB#$BF + sBuf;
  end;

  FM := TFileStream.Create('e:\d.ini' , fmCreate);
  FM.WriteBuffer(Pointer(sBuf)^ , Length(sBuf));
  FM.Free;
end;
m0_37551303 2017-02-20
  • 打赏
  • 举报
回复
引用 1 楼 kiboisme 的回复:
高版本的Delphi,直接 var ini : TMemIniFile; var ini := TMemIniFile.Create('xxx.ini', TEncoding.UTF8); 部分方法没有,用WriteString和ReadString,来处理integer等 如果是低版本的Delphi,如Delphi7 首先取取ini文件,判断并去掉头部3字节,然后转换为AnsiString,保存到临时文件,然后TiniFile.Create(临时文件) 修改完之后,读取这个临时文件,用你的代码保存到原来的文件即可。
我就是D7大神能给个例句不?
蓝色光芒 2017-02-20
  • 打赏
  • 举报
回复
高版本的Delphi,直接 var ini : TMemIniFile; var ini := TMemIniFile.Create('xxx.ini', TEncoding.UTF8); 部分方法没有,用WriteString和ReadString,来处理integer等 如果是低版本的Delphi,如Delphi7 首先取取ini文件,判断并去掉头部3字节,然后转换为AnsiString,保存到临时文件,然后TiniFile.Create(临时文件) 修改完之后,读取这个临时文件,用你的代码保存到原来的文件即可。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧