【问题标题】:How to count string length in bytes in NSIS 3.03 Unicode如何在 NSIS 3.03 Unicode 中以字节为单位计算字符串长度
【发布时间】:2018-04-18 11:23:50
【问题描述】:

在将我们的 NSIS 设置从 2.46 移植到 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 的结果加倍解决了这个问题。

现在的问题是:

  1. 使用哪个函数来确定字符串的字节长度?
  2. NSIS 使用什么内部 Unicode 编码?
  3. 长度加倍是否安全,NSIS 是否使用固定宽度的 Unicode 编码?

【问题讨论】:

    标签: unicode nsis


    【解决方案1】:

    NSIS Unicode 安装程序使用 UTF-16LE 字符串,就像 Windows 一样。 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"
    

    NSIS_CHAR_SIZE是一个字符编码单元的大小; 1 个在 ANSI 安装程序中,2 个在 Unicode 安装程序中。

    【讨论】:

      猜你喜欢
      • 2015-01-21
      • 2013-05-07
      • 2014-07-16
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 2014-08-09
      相关资源
      最近更新 更多