; 编码
MsgBox % URLEncode("中文")
URLEncode(Uri) {
VarSetCapacity(Var, StrPut(Uri, "UTF-8"), 0)
, StrPut(Uri, &Var, "UTF-8")
, f := A_FormatInteger
SetFormat, IntegerFast, H
while Code := NumGet(Var, A_Index - 1, "UChar")
if (Code >= 0x30 && Code <= 0x39 ; 0-9
|| Code >= 0x41 && Code <= 0x5A ; A-Z
|| Code >= 0x61 && Code <= 0x7A) ; a-z
Res .= Chr(Code)
else
Res .= "%" . SubStr(Code + 0x100, -1)
SetFormat, IntegerFast, %f%
return Res
}
; 解码
MsgBox % URLDecode("%E4%B8%AD%E6%96%87")
URLDecode(url) {
position := 1
Loop {
position := RegExMatch(url, "i)(?:%[0-9a-f]{2})+", code, position)
if (position = 0)
Break
VarSetCapacity(binary, StrLen(code) // 3, 0)
Loop, Parse, % SubStr(code, 2), % "%"
NumPut("0x" . A_LoopField, binary, A_Index - 1, "UChar")
replacement := StrGet(&binary, "UTF-8")
, url := RegExReplace(url, "i)(?:%[0-9a-f]{2})+", replacement, , 1, position)
, position := position + StrLen(replacement)
}
Return url
}
/* ; 不过滤123abc
UrlEncode(str, enc:="UTF-8") {
hex := "00"
, VarSetCapacity(buff, size:=StrPut(str, enc))
, StrPut(str, &buff, enc)
while(code:=NumGet(buff, A_Index - 1, "UChar")) && dllcall("msvcrt\swprintf", "str",hex, "str","%%%02X", "uchar",code, "cdecl")
r .= hex
return r
}
*/
/* v2版
MsgBox(UrlEscape('中国'))
UrlEscape(url) {
DllCall('shlwapi\UrlEscape', 'str', url, 'ptr*', 0, 'uint*', &l := 1, 'uint', f := 0xc2000)
DllCall('shlwapi\UrlEscape', 'str', url, 'ptr', b := Buffer(l << 1), 'uint*', &l, 'uint', f)
return StrGet(b)
}
*/
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。

评论(0)