NSIS写入器Unicode

NSIS写入器Unicode,unicode,ascii,nsis,Unicode,Ascii,Nsis,我正在尝试为我编写的应用程序构建NSIS安装程序 安装程序获取大量用户详细信息并将其写入INI文件。我目前遇到的问题是,创建的INI文件是ASCII文件。这意味着,如果用户输入任何Unicode或不支持的语言,我将在ini文件中获得?? 使用NSIS如何编写Unicode INI文件 更新1: 好的,当我注意到有一个新版本的NSIS(v3.0a)有更多的Unicode选项时,我想我会安装这个来看看它是否有效 以前的应用程序代码是完全兼容的,并且已生成exe,但问题仍然是WriteINIStr不编

我正在尝试为我编写的应用程序构建NSIS安装程序

安装程序获取大量用户详细信息并将其写入INI文件。我目前遇到的问题是,创建的INI文件是ASCII文件。这意味着,如果用户输入任何Unicode或不支持的语言,我将在ini文件中获得
??

使用NSIS如何编写Unicode INI文件

更新1: 好的,当我注意到有一个新版本的NSIS(v3.0a)有更多的Unicode选项时,我想我会安装这个来看看它是否有效


以前的应用程序代码是完全兼容的,并且已生成exe,但问题仍然是WriteINIStr不编写unicode。

如果您使用的是最新的稳定版本2.46,NSIS不支持unicode,您应该通过
FileOpen
/
FileWrite
/
FileClose
并通过系统插件转换文本来构建.ini文件

自2009年以来,人们期待已久的unicode分支正在酝酿之中,我没有注意到a刚刚发布,可以在下载站点上找到。(在此之前,您需要检查代码并自己构建二进制文件)

你应该试试看

编辑:我制作了一个小脚本,演示如何使用NSIS 2.46“手动”编写UTF-16le文本文件,如果文本框中包含“外来”字符的字符串正确写入测试文件,您可以尝试

!包括LogicLib.nsh
名称“unicode246”
OutFile unicode246.exe
ShowInstDetails显示
部分
StrCpy$1“héhé©reçu”;一些“异国情调”的法国甜菜
斯特伦2美元1美元
系统::调用“*(&w${NSIS\u MAX\u STRLEN}r1)i.s”;分配缓冲区并写入宽字符
流行音乐0美元;获取缓冲区地址
FileOpen$9$EXEDIR\test.txt w;打开文件进行写入
;编写UTF-16LE BOM表
FileWriteByte$9“255”
FileWriteByte$9“254”
;计算缓冲区字节大小
输入$2$2*2
输入$2$2-1
;在字节上循环
${forEach}$10$2+1
IntOp$3$0+1;计算第n个字节的地址
系统::调用“*$3(&i1.r4)”;读取$4中的字节
DetailPrint“地址$0+1=$3=$4”
FileWriteByte$9$4
${next}
文件关闭$9
系统::免费$0;自由缓冲区
分段结束

WriteINIStr
调用WritePrivateProfileString,而Unicode版本(WritePrivateProfileStringW)也默认写入ansi,它将写入UTF16LE


因此,您可以使用基本NSIS File*函数查看是否存在BOM,如果没有,您可以在使用ini命令之前添加它…

我曾尝试过unicode分支,但发现WriteINIStr仍然只执行ASCII(多么烦人),我将很快尝试您的建议。您明确表示了吗?如果3.0 alpha不适合你,还有nsis的2.46。我制作了一个原型,用nsis 2.46创建了一个utf16 le文件,希望它能帮助你。谢谢@seki,我会让你知道我是如何相处的。@idleberg我查看了unicode fork,但编写器仍然只使用ascii。