在将我们的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的结果加倍来解决问题。
现在的问题是:
答案 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。