Первый этап - разделить строку запроса и сформировать из нее словарь (что не совсем правильно, но я предполагаю, что вам не важно, когда кто-то помещает в запрос несколько полей имени пользователя).строка!).Тем не менее, вам также нужно декодировать кодировку содержимого, и это довольно ужасно:
proc QueryStringToDict {qs} {
set mapping {}
foreach item [split $qs "&"] {
if {[regexp {^([^=]+)=(.*)$} $item -> key value]} {
dict set mapping [DecodeURL $key] [DecodeURL $value]
}
}
return $mapping
}
proc DecodeURL {string} {
# This *is* tricky! The URL encoding of fields is way nastier than you thought!
set mapped [string map {+ { } \[ "\\\[" \] "\\\]" $ "\\$" \\ "\\\\"} $string]
encoding convertfrom utf-8 \
[subst [regsub -all {%([[:xdigit:]]{2})} $string {[format %c 0x\1]}]]
}
set qs "username=james&password=pwd"
set info [QueryStringToDict $qs]
puts "user name is [dict get $info username]"
В 8.7 (в настоящее время в альфа-режиме) будет гораздо проще выполнить внутреннее кодирование;например, subst
звонить туда не нужно.Но у вас нет этой версии Tcl;никто не имеет (за исключением людей, которые настаивают на том, чтобы быть на острие и попадают в неприятности из-за этого).