Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 2886|回复: 2

TIniPropStorage 和 TXMLPropStorage的乱码问题

[复制链接]

该用户从未签到

发表于 2013-11-7 19:10:03 | 显示全部楼层 |阅读模式
本帖最后由 goomoo 于 2013-11-7 19:56 编辑

用 TIniPropStorage 保存的 ini 文件,如果文件中有中文,并且用记事本编辑后保存,再用 TIniPropStorage 读入,就出现乱码问题。文件保存的格式是 utf8。

用 TXMLPropStorage 保存的 xml 文件,如果有中文,则直接是乱码;用 TXMLPropStorage 再读入时,最后一个文字变成两个问号。

大家有遇到过这样的情况吗? 如何解决呢?

ini的代码:
procedure TForm1.btnSaveClick(Sender: TObject);
begin
  self.ini.IniSection:='databaseConfig';
  self.ini.WriteString('host',self.leHost.Text);
  self.ini.WriteString('port',self.lePort.Text);
  self.ini.WriteString('username',self.leUsername.Text);
  self.ini.WriteString('password',self.lePassword.Text);
  self.ini.WriteString('dbname',self.leDBName.Text);

  self.ini.IniSection:='appInfo';
  self.ini.WriteString('appTitle','中文软件标题');
  self.ini.WriteString('appVersion','1.2.3.4');
  self.ini.WriteString('CompanyTel','18971688888');

  self.ini.Save();
end;

procedure TForm1.loadConfigI;
begin
  self.ini.IniSection:='databaseConfig';
  self.leHost.Text:=self.ini.ReadString('host','localhost');
  self.lePort.Text:=self.ini.ReadString('port','3306');
  self.leUsername.Text:=self.ini.ReadString('username','root');
  self.lePassword.Text:=self.ini.ReadString('password','');
  self.leDBName.Text:=self.ini.ReadString('dbname','');

  self.ini.IniSection:='appInfo';
  ShowMessage(self.ini.ReadString('appTitle',''));
end;

////////////////////////////////////////////////////////////////////////////
xml的代码

procedure TForm1.saveConfig;
begin
  self.xmlps.RootNodePath:='dbconfig';
  self.xmlps.WriteString('host',self.leHost.Text);
  self.xmlps.WriteString('username',self.leUsername.Text);
  self.xmlps.WriteString('dbname',self.leDBName.Text);

  self.xmlps.RootNodePath:='appinfo';
  self.xmlps.WriteString('appTitle',self.leAppTitle.Text);
  self.xmlps.WriteString('appVersion',self.leAppVersion.Text);

  self.xmlps.Save();
end;

procedure TForm1.loadConfig;
begin
  self.xmlps.RootNodePath:='dbconfig';
  self.leHost.Text:=self.xmlps.ReadString('host','');
  self.leUsername.Text:=self.xmlps.ReadString('username','');
  self.leDBName.Text:=self.xmlps.ReadString('dbname','');
  self.xmlps.RootNodePath:='appinfo';
  self.leAppTitle.Text:=self.xmlps.ReadString('appTitle','');
  self.leAppVersion.Text:=self.xmlps.ReadString('appVersion','');

end;




回复

使用道具 举报

该用户从未签到

发表于 2013-11-7 20:37:20 | 显示全部楼层
windows 的记事本保存UTF-8文件会在头部加上BOM标志,所以不用用记事本来编辑那些没有BOM头的文件。
其实你的问题就是字符集的问题,lazarus用的UTF-8,保存的磁盘文件也没有BOM头(这玩意貌似是微软自己搞的)
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2013-11-7 21:26:51 | 显示全部楼层
bowa 发表于 2013-11-7 20:37
windows 的记事本保存UTF-8文件会在头部加上BOM标志,所以不用用记事本来编辑那些没有BOM头的文件。
其实你 ...

INI 文件确实是这样的。但是xml文件,好像直接就乱码掉了。
回复 支持 反对

使用道具 举报

*滑块验证:

本版积分规则

QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

GMT+8, 2025-5-2 20:39 , Processed in 0.025929 second(s), 10 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表