使用http::getUrl解析cp1252编码特殊字符字符串失败问题
解决Tcl http::geturl解析含特殊字符查询参数的问题
问题根源
HTTP协议要求查询参数使用UTF-8编码,但你的$message变量是CP1252编码的字节流(åæø对应十六进制e5e6f8),直接传入http::geturl的-query参数时,不符合HTTP规范的编码要求,导致解析失败。
解决方案
需要先将CP1252编码的字节串转换为Tcl内部Unicode字符串,再转成HTTP要求的UTF-8编码字节串,具体代码如下:
# 把CP1252编码的字节串转成Tcl内部Unicode字符 set unicode_msg [encoding convertfrom cp1252 $message] # 再将Unicode字符转成UTF-8编码的字节串 set utf8_msg [encoding convertto utf-8 $unicode_msg] # 调用http::geturl时传入处理后的UTF-8字符串 set token [::http::geturl $url -query $utf8_msg]
也可以合并为一行简化操作:
set token [::http::geturl $url -query [encoding convertto utf-8 [encoding convertfrom cp1252 $message]]]
验证
处理后再执行binary scan $utf8_msg H* hex,得到的十六进制值会是预期的c3a5c3a6c3b8,符合HTTP查询参数的编码规范,即可避免解析错误。
内容的提问来源于stack exchange,提问作者lars1595
相关产品推荐
相关产品推荐

