StrPut() / StrGet() [AHK_L 46+]

优质
小牛编辑
130浏览
2023-12-01

复制字符串到内存地址或来自内存地址, 并可以对其在指定代码页间进行转换.

StrPut(String [, Encoding = None ] )
StrPut(String, Address [, Length] [, Encoding = None ] )
StrGet(Address [, Length] [, Encoding = None ] )

参数

String

任何字符串. 也可以接受数字.

Address

字符串将被写入或读取的地址.

Length

需读取/写入的字符的最大数目, 需要时包含空终止符. 请参阅返回值。

Encoding

用于 StrGet 的源编码或用于 StrPut 的目标编码; 例如, "UTF-8", "UTF-16" 或 "CP936". 如果 AddressLength 都没有指定, 那么数值标识符必须加上 "CP" 前缀. 指定空字符串或 "CP0" 则使用系统默认 ANSI 代码页.

返回值

对每个函数, 无效的参数会让它们返回空字符串.

StrPut 返回写入的字符数, 如果没有指定 Address 则返回以字符数表示的必须的缓冲区大小, 如果遇到错误则返回 0. 如果 Length 小于源字符串的长度, 那么函数失败且返回 0. 如果 Length 准确等于源字符串的长度, 那么字符串不包含空终止符; 否则返回的数目包含空终止符.

StrGet 返回所请求的进行必要转换后的字符串.

备注

注意 StrPut 的 String 参数或 StrGet 的返回值总是为当前可执行程序的 原生编码, 而 Encoding 则指定写入的或从指定 Address 读取的字符串编码. 如果未指定 Encoding, 则对字符串进行简单长度计算或复制而不进行转换.

如果需要在代码页之间转换, 那么需要的缓存大小可能不同于源 String 的大小.

需要兼容于 AutoHotkey Basic 的脚本仍可以使用 StrPut 和 StrGet, 此时它们是由安装在 函数库 中的 相应的脚本文件 提供的. 这些脚本可以在 AutoHotkey 社区论坛 中找到.

相关

脚本兼容性, FileEncoding, VarSetCapacity()

示例

LengthEncoding 都可以在 Address 后直接指定, 不过此时 Encoding 必须用非数值表示:

strA := StrGet(addressA, "cp0")     ; OK
strA := StrGet(addressA, length, 0) ; OK
strA := StrGet(addressA, 0)         ; 错误

可以调用一次 StrPut 来计算字符串在特殊编码时需要的缓冲区大小, 然后再进行编码并把字符串写入缓冲区. 如果您常用 StrPut 操作变量, 那么考虑把此函数添加到您 中:

StrPutVar(string, ByRef var, encoding)
{
    ; 确定容量.
    VarSetCapacity( var, StrPut(string, encoding)
        ; StrPut 返回字符数, 但 VarSetCapacity 需要字节数.
        * ((encoding="utf-16"||encoding="cp1200") ? 2 : 1) )
    ; 复制或转换字符串.
    return StrPut(string, &var, encoding)
}