首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSIS WriteINIStr Unicode

NSIS WriteINIStr Unicode
EN

Stack Overflow用户
提问于 2013-07-03 17:27:44
回答 2查看 1.4K关注 0票数 2

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

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

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-03 18:35:01

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

自2009年以来,有一个期待已久的unicode分支正在酝酿之中,我没有注意到刚刚发布了一个v 3.0a0,并且可以在下载网站上找到它。(直到您需要签出代码并自己构建二进制文件为止)。

你应该试一试。

编辑:我制作了一个小脚本来演示如何使用NSIS2.46“手动”编写UTF16LE文本文件,您可以尝试将文本框中包含“奇异”字符的字符串正确写入测试文件

代码语言:javascript
复制
!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
票数 1
EN

Stack Overflow用户

发布于 2013-07-04 04:56:22

WriteINIStr调用WritePrivateProfileString,虽然Unicode版本(WritePrivateProfileStringW)默认也写成ansi,但它会写成UTF16LE if the .ini file has a BOM

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17444363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档