StrPut() / StrGet() [AHK_L 46+]
复制字符串到内存地址或来自内存地址, 并可以对其在指定代码页间进行转换.
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". 如果 Address 和 Length 都没有指定, 那么数值标识符必须加上 "CP" 前缀. 指定空字符串或 "CP0" 则使用系统默认 ANSI 代码页.
返回值
对每个函数, 无效的参数会让它们返回空字符串.
StrPut 返回写入的字符数, 如果没有指定 Address 则返回以字符数表示的必须的缓冲区大小, 如果遇到错误则返回 0. 如果 Length 小于源字符串的长度, 那么函数失败且返回 0. 如果 Length 准确等于源字符串的长度, 那么字符串不包含空终止符; 否则返回的数目包含空终止符.
StrGet 返回所请求的进行必要转换后的字符串.
备注
注意 StrPut 的 String 参数或 StrGet 的返回值总是为当前可执行程序的 原生编码, 而 Encoding 则指定写入的或从指定 Address 读取的字符串编码. 如果未指定 Encoding, 则对字符串进行简单长度计算或复制而不进行转换.
如果需要在代码页之间转换, 那么需要的缓存大小可能不同于源 String 的大小.
需要兼容于 AutoHotkey Basic 的脚本仍可以使用 StrPut 和 StrGet, 此时它们是由安装在 函数库 中的 相应的脚本文件 提供的. 这些脚本可以在 AutoHotkey 社区论坛 中找到.
相关
脚本兼容性, FileEncoding, VarSetCapacity()
示例
Length 或 Encoding 都可以在 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) }