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

时间:2018-04-18 11:23:50

标签: unicode nsis

在将我们的NSIS设置从2.46移植到3.03 Unicode时,我遇到了一个问题,即使用System插件在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编码加倍安全?

1 个答案:

答案 0 :(得分:1)

NSIS Unicode安装程序使用UTF-16LE字符串,就像Windows一样。 UTF-16LE在字符(代理对等)方面不是固定宽度,但可以安全地将assign(paste0("table", j), read.table(sampleFiles[j], header = TRUE)) 的返回值加倍。

一个常见的"字符串大小,以字节为单位"成语看起来像这样:

StrLen

NSIS_CHAR_SIZE是字符代码单元的大小; ANSI安装程序中为1,Unicode安装程序中为2。