注册 登录
编程论坛 VFP论坛

请教VFP 里encodeURI来解决URL传递时的中文问题

laibinhua 发布于 2023-05-08 13:04, 255 次点击
请教,现在一个地址带了中文无法下载文件,比如
http://127.0.0.1:9880/chfs/shared/eqpt_file/202305/C6B9##QQ图片20220824145938.jpg
转换成就可以
http://127.0.0.1:9880/chfs/shared/eqpt_file/202305/C6B9%23%23QQ%E5%9B%BE%E7%89%8720220824145938.jpg
VFP用什么方式转换呢

[此贴子已经被作者于2023-5-8 13:05编辑过]

10 回复
#2
sdta2023-05-08 13:17
对楼主是否有帮助
* 只对双字节字符编(解)码_UTF8编码;
* 还有一种常用的GB2312编码,方法逐个取双字节符用 TRANSFORM() 进行转换。
* cc = RIGHT(TRANSFORM(ASC("中"), "@0"), 4)
* 还原:CHR(EVALUATE("0x" + cc))
CLEAR
lcPath = JUSTPATH(SYS(16))

lc = "西安音12乐学院"
? lc
\*****************************************
\ URL编码
? UrlEncode(lc)
\ URL解码
? UrlDecode(UrlEncode(lc))
? UrlDecode("%E8%A5%BF%E5%AE%89%E9%9F%B3%E4%B9%90%E5%AD%A6%E9%99%A2")
STRTOFILE(UrlEncode(lc), "BM.TXT")
MODIFY FILE BM.TXT


* URL编码
FUNCTION UrlEncode(cStr)
    LOCAL lcValue, lcEnStr, lc, lnJ, lnK
    lcEnStr = ""
    FOR lnJ = 1 TO LEN(cStr)
        lc = SUBSTR(cStr, lnJ, 1)
        IF ISLEADBYTE(lc)
            lc = SUBSTR(cStr, lnJ, 2)
            lnJ = lnJ + 1
            lcValue = STRCONV(STRCONV(lc, 9), 15)
            FOR lnK = 1 TO LEN(lcValue) STEP 2
                lcEnStr = lcEnStr + "%" + SUBSTR(lcValue, lnK, 2)
            ENDFOR
        ELSE
            lcEnStr = lcEnStr + lc
        ENDIF
    ENDFOR
    RETURN lcEnStr
ENDFUNC
* URL解码
FUNCTION UrlDecode(cEncode)
    LOCAL lcStr, lnJ, laCode[1]
    lcStr = ""
    FOR lnJ = 1 TO ALINES(laCode, cEncode, 5, "%") STEP 3
        lcStr = lcStr + STRCONV(STRCONV(laCode[lnJ] + laCode[lnJ + 1] + LEFT(laCode[lnJ + 2], 2), 16), 11) + SUBSTR(laCode[lnJ + 2], 3)
    ENDFOR
    RETURN lcStr
ENDFUNC
#3
laibinhua2023-05-08 13:42
真历害,用你发的运行了了结果基本一至了,就差了把#转换成%23
UrlEncode('BF82##发票开具项目信息导入模板.xlsx')
这是用你发的UrlEncode(cStr)转出来的结果,
BF82##%E5%8F%91%E7%A5%A8%E5%BC%80%E5%85%B7%E9%A1%B9%E7%9B%AE%E4%BF%A1%E6%81%AF%E5%AF%BC%E5%85%A5%E6%A8%A1%E6%9D%BF.xlsx
真实好用的结果要这样
BF82%23%23%E5%8F%91%E7%A5%A8%E5%BC%80%E5%85%B7%E9%A1%B9%E7%9B%AE%E4%BF%A1%E6%81%AF%E5%AF%BC%E5%85%A5%E6%A8%A1%E6%9D%BF.xlsx
查询了资料有这些字符规定
只有本站会员才能查看附件,请 登录
#4
foxfans2023-05-08 14:12
urlDecode可以考虑用Vfp自带函数来解码,避免循环提升效率
?STRCONV(STRCONV("%E8%A5%BF%E5%AE%89%E9%9F%B3%E4%B9%90%E5%AD%A6%E9%99%A2",16),11)
#5
sdta2023-05-08 14:17
,,,,,,,,,,,,,,,,,,,

[此贴子已经被作者于2023-5-8 14:40编辑过]

#6
sdta2023-05-08 14:24
? UrlEncode("##QQ图片")
#7
sdta2023-05-08 14:36
这个应该能满足要求吧
CLEAR
SET TALK OFF
lcString = "BF82##发票开具项目信息导入模板.xlsx"
oJS = CreateObject("MSScriptControl.ScriptControl")
oJS.Language = "javascript"
\*!* 编码
?oJs.eval([javascript:encodeURI('] + lcString + [')])
\*!* 解码
?oJs.eval("javascript:decodeURI('%E6%98%8E%E5%AA%9A%E3%81%AE%E5%93%80%E5%82%B7')")
release oJS
#8
吹水佬2023-05-08 14:51
也可以调用JS的encodeURI()和encodeURIComponent()

两者对httpURL中的预留符号编译的结果
只有本站会员才能查看附件,请 登录


两者都不会对[a-zA-Z0-9]的字符以及!*()'.进行编码,即编码之后还是本身。
两者对中文的解析结果是一样的。

decodeURI()和decodeURIComponent()是对应的解码函数
#9
laibinhua2023-05-08 21:04
回复 8楼 吹水佬
调用JS的encodeURI()和encodeURIComponent()
这种方法也不错具体代码如何写呢?
#10
laibinhua2023-05-08 21:17
回复 7楼 sdta
lcString = "BF82##发票开具项目信息导入模板.xlsx" 用oJs.eval([javascript:encodeURI('] + lcString + [')])方法解析出来是下面这样,二个##没有做转换,其他对的
BF82##%E5%8F%91%E7%A5%A8%E5%BC%80%E5%85%B7%E9%A1%B9%E7%9B%AE%E4%BF%A1%E6%81%AF%E5%AF%BC%E5%85%A5%E6%A8%A1%E6%9D%BF.xlsx
正确转换要这样
BF82%23%23%E5%8F%91%E7%A5%A8%E5%BC%80%E5%85%B7%E9%A1%B9%E7%9B%AE%E4%BF%A1%E6%81%AF%E5%AF%BC%E5%85%A5%E6%A8%A1%E6%9D%BF.xlsx
#11
吹水佬2023-05-08 21:20
以下是引用laibinhua在2023-5-8 21:04:46的发言:

调用JS的encodeURI()和encodeURIComponent()
这种方法也不错具体代码如何写呢?

url = [http://www.baidu.com/s?wd=!#$&'"()*+,/:;=?@-._~'ISO9000质量管理体系'"]
script = CREATEOBJECT("ScriptControl")
script.Language = "JavaScript"
? script.run("encodeURI",url)
? script.run("encodeURIComponent",url)
1