如何在NSIS 3.03 Unicode中以字节为单位计算字符串长度

如何在NSIS 3.03 Unicode中以字节为单位计算字符串长度,unicode,nsis,Unicode,Nsis,在将NSIS设置从2.46 Unicode移植到3.03 Unicode时,我遇到了一个问题,即使用系统插件在NSIS中的最大字符串长度附近工作: System::Alloc 8096 Exch $1 IntOp $2 $1 + 0 ${For} $iLoopIndex1 1 $stackSize ${stack::dll_read} "$stacktext" "$iLoopIndex1" $TmpVal $stackReturn StrLen $3 "$Tm

在将NSIS设置从2.46 Unicode移植到3.03 Unicode时,我遇到了一个问题,即使用系统插件在NSIS中的最大字符串长度附近工作:

  System::Alloc 8096
  Exch $1

  IntOp $2 $1 + 0

  ${For} $iLoopIndex1 1 $stackSize
    ${stack::dll_read} "$stacktext" "$iLoopIndex1" $TmpVal $stackReturn
    StrLen $3 "$TmpVal"
    System::Call "*$2(&t$3 $\"$TmpVal$\")"
    IntOp $2 $2 + $3
  ${Next}

  System::Call "user32::SetWindowText(i $CstPage.InfoExt.Text, i r1) i .s"
  Pop $TmpVal

  System::Free $1
该函数还使用了我们移植来支持Unicode的堆栈插件

StrLen返回字符串中的字符数,然后用于将字符串添加到缓冲区。对于Unicode构建,一个字符填充两个字节,这会破坏缓冲区中的文本

我通过将StrLen的结果加倍,解决了这个问题

现在的问题是:

  • 使用哪个函数确定字符串的长度(以字节为单位)
  • NSIS中使用了什么内部Unicode编码
  • 将长度加倍是否安全,NSIS是否使用固定宽度的Unicode编码

  • NSIS Unicode安装程序与Windows一样使用UTF-16LE字符串。UTF-16LE在字符(代理项对等)方面不是固定宽度,但可以安全地将
    StrLen
    的返回值加倍

    常见的“以字节为单位的字符串大小”习惯用法如下所示:

    StrLen $1 "$2"
    IntOp $1 $1 + 1 ; Add \0 terminator
    !if "${NSIS_CHAR_SIZE}" > 1
        IntOp $1 $1 * ${NSIS_CHAR_SIZE}
    !endif
    DetailPrint "$2 is $1 bytes"
    
    是字符代码单位的大小;1个在ANSI安装程序中,2个在Unicode安装程序中