2

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

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

使用 NSIS 如何编写 Unicode INI 文件?

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

以前的应用程序代码完全兼容并且构建了 exe,但是,WriteINIStr 不写入 unicode 的问题仍然存在。

4

2 回答 2

2

WriteINIStr调用 WritePrivateProfileString 并且 Unicode 版本 (WritePrivateProfileStringW) 默认情况下也写为 ansi,如果 .ini 文件有 BOM,它将写为 UTF16LE 。

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

于 2013-07-03T20:56:21.723 回答
1

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

自 2009 年以来一直在酝酿一个期待已久的 unicode 分支,我没有注意到刚刚发布的v 3.0a0可以在下载站点上找到。(直到您需要检查代码并自己构建二进制文件)。

你应该试一试。

编辑:我制作了一个小脚本来演示如何使用 NSIS 2.46“手动”编写 UTF-16le 文本文件,您可以尝试是否将文本框中带有“异国情调”字符的字符串正确写入测试文件

!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-03T10:35:00.737 回答