我正在尝试为我编写的应用程序构建一个NSIS安装程序。
安装程序获取大量用户详细信息,并将这些信息写入INI文件。我目前遇到的问题是创建的INI文件是ASCII。这意味着,如果用户输入任何Unicode或来自不受支持的语言,我将在ini文件中获得????。
如何使用NSIS编写Unicode INI文件?
更新1:好的,当我注意到有一个新版本的NSIS (v3.0a)有更多的Unicode选项时,我想我应该安装这个来看看它是否工作。
以前的应用程序代码是完全兼容的,并且构建了exe,但是,问题仍然存在,即WriteINIStr不编写unicode。
发布于 2013-07-03 18:35:01
如果您使用的是最新的稳定版本2.46,NSIS不支持unicode,您应该通过FileOpen / FileWrite / FileClose自己构建.ini文件,并通过系统插件转换文本。
自2009年以来,有一个期待已久的unicode分支正在酝酿之中,我没有注意到刚刚发布了一个v 3.0a0,并且可以在下载网站上找到它。(直到您需要签出代码并自己构建二进制文件为止)。
你应该试一试。
编辑:我制作了一个小脚本来演示如何使用NSIS2.46“手动”编写UTF16LE文本文件,您可以尝试将文本框中包含“奇异”字符的字符串正确写入测试文件
!include LogicLib.nsh
Name "unicode246"
OutFile unicode246.exe
ShowInstDetails show
Section
StrCpy $1 "héhé © reçu" ;some "exotic" french chars
StrLen $2 $1
System::Call "*(&w${NSIS_MAX_STRLEN} r1)i.s" ;allocate a buffer and write in wide char
Pop $0 ;get the buffer address
FileOpen $9 $EXEDIR\test.txt w ;Opens a file for writing
;write UTF-16LE BOM
FileWriteByte $9 "255"
FileWriteByte $9 "254"
;compute the buffer byte size
IntOp $2 $2 * 2
IntOp $2 $2 - 1
;loop on the bytes
${forEach} $1 0 $2 + 1
IntOp $3 $0 + $1 ;compute the address of the nth byte
System::Call "*$3(&i1 .r4)" ;read the byte in $4
DetailPrint "address $0 + $1 = $3 = $4"
FileWriteByte $9 $4
${next}
FileClose $9
System::Free $0 ;free buffer
SectionEnd发布于 2013-07-04 04:56:22
WriteINIStr调用WritePrivateProfileString,虽然Unicode版本(WritePrivateProfileStringW)默认也写成ansi,但它会写成UTF16LE if the .ini file has a BOM。
因此,您可以使用基本的NSIS File*功能来查看是否存在BOM,如果没有,则可以在使用ini命令之前添加它。
https://stackoverflow.com/questions/17444363
复制相似问题