Encoding 将INI文件保存在UTF-8中,而不是Inno设置中的ANSI

Encoding 将INI文件保存在UTF-8中,而不是Inno设置中的ANSI,encoding,utf-8,inno-setup,ini,codepages,Encoding,Utf 8,Inno Setup,Ini,Codepages,我开始使用Inno设置,我的INI文件编码有一些问题。 我想将用户输入保存在INI文件中,该输入可以包含重音符号 我使用Inno Setup Unicode,我的setupScript.iss是UTF-8编码的,下面是我的代码a部分: [INI] 文件名:{app}\www\conf\config.ini;第二节:设置;关键词:白花蛇舌草;字符串:{code:GetUser | Plafond} 文件名:{app}\www\conf\config.ini;第二节:设置;按键:app.siren;

我开始使用Inno设置,我的INI文件编码有一些问题。 我想将用户输入保存在INI文件中,该输入可以包含重音符号

我使用Inno Setup Unicode,我的setupScript.iss是UTF-8编码的,下面是我的代码a部分:

[INI] 文件名:{app}\www\conf\config.ini;第二节:设置;关键词:白花蛇舌草;字符串:{code:GetUser | Plafond} 文件名:{app}\www\conf\config.ini;第二节:设置;按键:app.siren;字符串:{code:GetUser | Siren} 文件名:{app}\www\conf\config.ini;第二节:设置;关键词:app.adrese;字符串:{code:GetUser | Adresse} [守则] 变量 UserPage:TInputQueryWizardPage; 示例页面:t输入选项向导页面; 非触发页面:t输入选项向导页面; FakeElemIndex:整数; FakeElem:TCustomEdit; 地址文本区:TNewMemo; 程序初始化; 开始 UserPage:=CreateInputQueryPagewpWelcome, “配置反应用程序”, '配置ici votre应用程序。安装完毕后,您就可以离开了。”; 添加'Siren:',False; Apple Po.Ad'PulaFunnAutuelePaulle LealEutoPrsies,Meta 0 Suvoune SouaTeez Pas Paulon No.Viffe CiffrDaffay. FakeElemIndex:=用户页面。添加“设计和制造厂附近的地址,完整名称:”,错误; FakeElem:=UserPage.Edits[FakeElemIndex]; AddressTextArea:=TNewMemo.CreateWizardForm; ADRESSEXTAREA.Parent:=FakeElem.Parent; AddressTextArea.SetBoundsFakeElem.Left,FakeElem.Top,FakeElem.Width,ScaleY50; //隐藏原始单行编辑 FakeElem.Visible:=False; 终止 函数GetUserParam:String:String; 开始 如果参数='ADRESE',则 结果:=ADRESSEXTAREA.Text 否则,如果参数='Siren',则 结果:=UserPage.Values[0] 否则,如果Param='Plafond',则 结果:=UserPage.Values[1]; 终止 getUser | Adresse在[INI]部分返回的值不是UTF-8编码的:我用Notepad++打开INI文件,我看到该文件是UTF-8编码的。但是值ADRESE是ANSI编码的如果我将文件的编码更改为ANSI,那么这个值是可读的

有人可以帮助我了解如何在UTF-8中保存此用户输入


非常感谢

Inno Setup[INI]部分的INI函数和SetIni*函数在内部使用Windows API函数

此函数根本不支持UTF-8。它只支持ANSI编码和UTF-16。 看

因此,如果目标应用程序依赖Windows API函数来读取UTF-8编码的INI文件,那么它是否能够读取该文件就更值得怀疑了

无论如何,如果您需要UTF-8,您必须将条目格式化为INI格式,并使用它来编写

最后一个选项是通过使用系统调用WritePrivateProfileString编写看似ANSI编码的字符串(实际上是UTF-8编码的)来破解它

为此,您需要在代码中将字符串转换为UTF-8。你可以用它

功能宽图表多字节码页:UINT;德沃德; lpWideCharStr:字符串;cchWideChar:整数;lpMultiByteStr:AnsiString; CCH多字节:整数;lpDefaultCharFake:整数; lpUsedDefaultCharFake:整数:整数; 外部的WideCharToMultiByte@kernel32.dllstdcall'; 常数 CP_UTF8=65001; 函数GetStringAsUtf8S:string:AnsiString; 变量 Len:整数; 开始 Len:=宽图表多字节CP_UTF8,0,S,长度,结果,0,0,0; 设置长度结果,Len; 宽图表多字节CP_UTF8,0,S,长度,结果,Len,0,0; 终止 函数WritePrivateProfileString lpAppName、lpKeyName、lpString、lpFileName:AnsiString:Integer; 外部的WritePrivateProfileStringA@kernel32.dllstdcall'; 过程CurStepChangedCurStep:TSetupStep; 变量 文件名:字符串; 开始 如果CurStep=ssInstall,则 开始 日志“写入INI文件”; 如果不是ForceDirectoriesExpandConstant“{app}\www\conf”,则 开始 MsgBox“为INI文件创建目录时出错”,mbError,MB_OK; 终止 其他的 开始 IniFileName:=ExpandConstant'{app}\www\conf\config.ini'; 如果WritePrivateProfileString 'Settings'、'ca.plafondAnnuel'、GetStringAsUtf8GetUser'Plafond', IniFileName=0或 WritePrivateProfileString 'Settings'、'app.siren'、GetStringAsUtf8GetUser'siren', IniFileName=0或 WritePrivateProfileString '设置','应用程序地址',GetStringAsUtf8GetUser'地址', IniFileName=0则 开始 MsgBox“写入INI文件时出错”,mbError,MB_OK; 终止 终止 终止 终止
请注意,代码中不应使用UTF-8。引用文章:。。。支持Unicode,但不支持其输入源。这意味着它确实如前所述使用Unicode字符串类型,但脚本中的任何文字Unicode字符都将转换为ANSI。这并不意味着您不能显示Unicode字符串:例如,您可以使用encod
编辑Unicode字符以构建Unicode字符串,如S:=$0100+$0101+'Aa';,或者使用LoadStringsFromFile从文件中加载字符串,或者使用{cm:…}常量。感谢您的回复。我必须使用UTF8,因为我在UTF8中制作了一个web应用程序,而没有想到以后可以将其安装为桌面应用程序。因此,ini conf文件也必须是utf8格式,以便我的web应用程序正确读取。所以,我必须能够写在这个ini文件在UTF8,而不是ANSI。非常感谢马丁,它的作品!我第一次尝试时,它没有工作,因为我的conf文件已经存在,即使conf密钥还不存在,但是如果我还没有conf文件,它就工作了!