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编码的,下面是我的代码(一部分): [INI] 文件名:“{app}\www\conf\config.ini”;第节:“设置”;关键词:“卡氏菌”;字符串:{code:GetUser | Plafond}” 文件名:“{app}\www\conf\config.ini”;第节:“设置”;按键:“

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

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

[INI]
文件名:“{app}\www\conf\config.ini”;第节:“设置”;关键词:“卡氏菌”;字符串:{code:GetUser | Plafond}”
文件名:“{app}\www\conf\config.ini”;第节:“设置”;按键:“应用程序警报”;字符串:“{code:GetUser | Siren}”
文件名:“{app}\www\conf\config.ini”;第节:“设置”;键:“app.address”;字符串:“{code:GetUser | Adresse}”
[守则]
变量
UserPage:TInputQueryWizardPage;
示例页面:t输入选项向导页面;
非触发页面:t输入选项向导页面;
FakeElemIndex:整数;
FakeElem:TCustomEdit;
地址文本区:TNewMemo;
程序初始化;
开始
UserPage:=CreateInputQueryPage(wpWelcome,
“应用程序的配置”,
“Configurez ici votre应用程序。请安装,然后安装。”);
添加('Siren:',False);
Apple Po.Adple(Pulfon Anuell(UTLIS PLE LES汽车公司,Meta 0 SV VE NE SouaTeez PAS Pravon No.Viffe CHIFRE D 'AfALE.)):“FALSE,FALSE”;
FakeElemIndex:=用户页面。添加('Votre address complète(telle qu'elle s'affichera sur les design et factures,avec nom complete):',假);
FakeElem:=UserPage.Edits[FakeElemIndex];
地址文本区域:=TNewMemo.Create(WizardForm);
ADRESSEXTAREA.Parent:=FakeElem.Parent;
地址文本区域立根(FakeElem.Left,FakeElem.Top,FakeElem.Width,ScaleY(50));
//隐藏原始单行编辑
FakeElem.Visible:=False;
结束;
函数GetUser(Param:String):String;
开始
如果参数='ADRESE',则
结果:=ADRESSEXTAREA.Text
否则,如果参数='Siren',则
结果:=UserPage.Values[0]
否则,如果Param='Plafond',则
结果:=UserPage.Values[1];
结束;
[INI]
部分中的
getUser | adrese
返回的值不是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;dwFlags:DWORD;
lpWideCharStr:string;cchWideChar:Integer;lpMultiByteStr:AnsiString;
cchMultiByte:整数;lpDefaultCharFake:整数;
lpUsedDefaultCharFake:Integer):整数;
外部的WideCharToMultiByte@kernel32.dllstdcall';
常数
CP_UTF8=65001;
函数GetStringAsUtf8(S: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):整数;
外部的WritePrivateProfileStringA@kernel32.dllstdcall';
过程CurStepChanged(CurStep:TSetupStep);
变量
文件名:字符串;
开始
如果CurStep=ssInstall,则
开始
日志(“写入INI文件”);
如果没有强制目录(ExpandConstant({app}\www\conf'),则
开始
MsgBox('为INI文件创建目录时出错',mbError,MB_OK);
结束
其他的
开始
IniFileName:=ExpandConstant('{app}\www\conf\config.ini');
if(WritePrivateProfileString(
'Settings'、'ca.plafondAnnuel'、GetStringAsUtf8(GetUser('Plafond'))、',
文件名)=0)或
(WritePrivateProfileString)(
“设置”、“应用程序警报”、GetStringAsUtf8(GetUser(“警报”),
文件名)=0)或
(WritePrivateProfileString)(
'设置','应用程序地址',GetStringAsUtf8(GetUser('地址'),
INI文件名)=0)然后
开始
MsgBox('写入INI文件时出错',mbError,MB_OK);
结束;
结束;
结束;
结束;

请注意,代码中不应使用UTF-8。引用文章:。。。支持Unicode,但不支持其输入源。这意味着它确实如前所述使用Unicode字符串类型,但脚本中的任何文字Unicode字符都将转换为ANSI。这并不意味着您不能显示Unicode字符串:例如,您可以使用编码的Unicode字符来构建Unicode字符串(如
S:=#$0100+#$0101+'Aa'
),或者使用
LoadStringsFromFile
从文件加载字符串,或者使用
{cm:…}
常量。感谢您的回复。我必须使用UTF8,因为我在UTF8中制作了一个web应用程序,而没有想到以后可以将其安装为桌面应用程序。因此,ini conf文件也必须是utf8格式,以便我的web应用程序正确读取。所以,我必须能够写在这个ini文件在UTF8,而不是ANSI。非常感谢马丁,它的作品!我第一次尝试的时候它不起作用,因为我的conf文件已经存在(即使conf密钥还不存在),但是如果我还没有conf文件,它就起作用了!