【问题标题】:Unicode mapping Error while opening INI files on MacOS在 MacOS 上打开 INI 文件时出现 Unicode 映射错误
【发布时间】:2016-09-23 21:31:45
【问题描述】:

我正在尝试使用 TIniFile 在 Mac OSX 上打开一个 INI 文件:

SettingsFile := TIniFile.Create(aINIFileName);   //Ini vertion
Try
  iUpdateMaj := SettingsFile.ReadInteger('CurrentVersion', 'Maj', 0);
  iUpdateMin := SettingsFile.ReadInteger('CurrentVersion', 'Min', 0);
  iUpdateRel := SettingsFile.ReadInteger('CurrentVersion', 'Rel', 0);
Finally
  SettingsFile.Free;
End;

我得到的确切错误是:

(EEncodingError) 目标多字节代码页中不存在 Unicode 字符的映射。

这在优胜美地之前工作得很好,但自从 El Capitan 之后就不再工作了。

根据我所做的研究,问题与 Unicode 结束有关。我知道用记事本创建的INI文件是用UTF-8编码的,TIniFile内部使用TStrings

有人知道如何解决这个问题吗?

【问题讨论】:

  • 哪一行具体失败了?问题是否与打开具有 Unicode 文件名的 INI 文件或使用 UTF-8 数据从 INI 读取值有关?它有很大的不同吗?抛出错误时调用堆栈是什么样的?到目前为止,您为自己调试做了哪些工作?
  • 它在 .create 行失败,更深入,它在:List.Text := FEncoding.GetString(Buffer, Size, Length(Buffer) - Size); System.IniFiles 中的 TMemIniFile.LoadValues proc 中的行,在 TEncoding.GetString 中,我可以看到由于 ByteCount

标签: macos delphi unicode firemonkey-fm3


【解决方案1】:

如果您的 .ini 文件是 UTF-8 编码并包含有效的 UTF-8 数据,那么您的代码看起来非常好。我不知道你的文件里面有什么,但看起来你的 .ini 文件不包含有效的 UTF-8 数据。

所以你必须找到你的 .ini 文件使用什么编码。如果你的 .ini 文件是 ANSI,那么你可以这样打开它:

SettingsFile := TIniFile.Create(aINIFileName, TEncoding.ANSI);

【讨论】:

  • 我看来该文件是 ANSI。通过添加 TEncoding.ANSI,它就可以工作了。子问题:使用像记事本这样的编辑器可以强制使用 UTF-8 编码吗?我确定记事本是以 UTF-8 编码的。
  • @AlainV 是的,您可以在记事本中强制使用 UTF-8。在“另存为”对话框中,有一个编码选项。
【解决方案2】:

这对我来说效果很好:

如果您的 .ini 文件是 UTF-8 编码并包含有效的 UTF-8 数据,那么您的代码看起来非常好。我不知道你的文件里面有什么,但看起来你的 .ini 文件不包含有效的 UTF-8 数据。

所以你必须找到你的 .ini 文件使用什么编码。如果你的 .ini 文件是 ANSI,那么你可以这样打开它:

SettingsFile := TINiFile.Create(aINIFileName, TEncoding.ANSI);

【讨论】:

  • 你和原始海报一样在 El Capitan 上吗?
  • 实际上我正在尝试使用 Android 设备;那很好用..;但是当我在 iPad 上尝试时,没有从 ini 文件中加载信息:(
  • 我刚试了一个 OSX El Capitan 并且工作正常!
猜你喜欢
  • 1970-01-01
  • 2017-04-27
  • 2020-11-27
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多