<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://panoptic.com/mediawiki/aolserver/index.php?action=history&amp;feed=atom&amp;title=Talk%3ANs_urlencode</id>
	<title>Talk:Ns urlencode - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://panoptic.com/mediawiki/aolserver/index.php?action=history&amp;feed=atom&amp;title=Talk%3ANs_urlencode"/>
	<link rel="alternate" type="text/html" href="https://panoptic.com/mediawiki/aolserver/index.php?title=Talk:Ns_urlencode&amp;action=history"/>
	<updated>2026-04-05T17:30:42Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>https://panoptic.com/mediawiki/aolserver/index.php?title=Talk:Ns_urlencode&amp;diff=2968&amp;oldid=prev</id>
		<title>Dossy: Moved content from Discussion of ns urlencode to this discussion page</title>
		<link rel="alternate" type="text/html" href="https://panoptic.com/mediawiki/aolserver/index.php?title=Talk:Ns_urlencode&amp;diff=2968&amp;oldid=prev"/>
		<updated>2005-10-07T18:11:38Z</updated>

		<summary type="html">&lt;p&gt;Moved content from &lt;a href=&quot;/mediawiki/aolserver/index.php?title=Discussion_of_ns_urlencode&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Discussion of ns urlencode (page does not exist)&quot;&gt;Discussion of ns urlencode&lt;/a&gt; to this discussion page&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;'''[[RHS]]''' ''21Oct2004''&lt;br /&gt;
&lt;br /&gt;
The command ''ns_urlencode'' currently doesn't do what it's name implies. What it does is to encode everything as if it were a query value. That means that you can do:&lt;br /&gt;
&lt;br /&gt;
 set url &amp;quot;http://www.aolserver.com/a/page/name?&amp;quot;&lt;br /&gt;
 set queryList {}&lt;br /&gt;
 foreach {key value} {key1 val1 key2 val2 ... ... keyN valN} {&lt;br /&gt;
     lappend queryList [ns_urlencode $key]=[ns_urlencode $value]&lt;br /&gt;
 }&lt;br /&gt;
 append url [join $queryList &amp;amp;]&lt;br /&gt;
 # http://www.aolserver.com/a/page/name?key1=val1&amp;amp;key2=val2&amp;amp;%2e%2e%2e=%2e%2e%2e&amp;amp;keyN=valN&lt;br /&gt;
&lt;br /&gt;
You cannot, however, do the following and have it behave correctly:&lt;br /&gt;
&lt;br /&gt;
 set url [ns_urlencode {http://www.aolserver.com/a/page/name?key1=value1&amp;amp;key2=value2&amp;amp;....&amp;amp;keyN=valueN}]&lt;br /&gt;
 # http%3a%2f%2fwww%2eaolserver%2ecom%2fa%2fpage%2fname%3fkey1%3dvalue1%26key2%3dvalue2%26%2e%2e%2e%2e%26keyN%3dvalueN&lt;br /&gt;
&lt;br /&gt;
I'd like to change ns_urlencode (and ns_urldecode, which has its own issues) to be able to handle actual URLs (or, specifically, URIs). The discussions I've had with Dossy over the subject lead to 2 possible solutions to the issue:&lt;br /&gt;
&lt;br /&gt;
   1. Add flags to ns_urlencode (and decode) for ''-url'' and ''-query'', which would change the behavior to either &amp;quot;treat this as a full url, and escape it as needed&amp;quot; or &amp;quot;treat this as a query element, and escape it as needed&amp;quot;. The default behavior would be that of -query (the same as it is now)&lt;br /&gt;
   2. Add a new command ''ns_url'' (with subcommands encode and decode) which would take the same flags, but the default would be to treat the input as if ''-url'' was specified. The original commands would then be depricated (but still available for a long time).&lt;br /&gt;
&lt;br /&gt;
Questions:&lt;br /&gt;
* '''How''' to encode things. I would assume the default encoding machanism would follow the rules of http (ie, use + for space in the query section, but %20 in the resource section)?&lt;br /&gt;
* Is it worthwhile implementing any other schemes, or should they all just follow the http lead?&lt;br /&gt;
* Should the scheme be added as a flag, determined from the url (which may or may not have the scheme) or both?&lt;br /&gt;
* Are there any test cases out there for url encoding? I searched, but couldn't find any.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
The code I have currently:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 # File: url.tcl&lt;br /&gt;
&lt;br /&gt;
 namespace eval ::ns::url {&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 proc ns_urlencode {args} {&lt;br /&gt;
    if { [llength $args] == 0 } {&lt;br /&gt;
        error &amp;quot;wrong # args: should be \&amp;quot;ns_urlencode ... data\&amp;quot;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    set charset utf-8&lt;br /&gt;
    set mode query&lt;br /&gt;
&lt;br /&gt;
    while { [llength $args] &amp;gt; 1 } {&lt;br /&gt;
        switch -exact -- [lindex $args 0] {&lt;br /&gt;
            -charset {&lt;br /&gt;
                set charset [lindex $args 1]&lt;br /&gt;
                set args [lrange $args 2 end]&lt;br /&gt;
            }&lt;br /&gt;
            -query {&lt;br /&gt;
                set mode query&lt;br /&gt;
                set args [lrange $args 1 end]&lt;br /&gt;
            }&lt;br /&gt;
            -url {&lt;br /&gt;
                set mode url&lt;br /&gt;
                set args [lrange $args 1 end]&lt;br /&gt;
            }&lt;br /&gt;
            -html {&lt;br /&gt;
                set mode html&lt;br /&gt;
                set args [lrange $args 1 end]&lt;br /&gt;
            }&lt;br /&gt;
            default {&lt;br /&gt;
                error &amp;quot;invalid option \&amp;quot;[lindex $args 0]\&amp;quot;: should be\&lt;br /&gt;
                       \&amp;quot;ns_urlencode ... data\&amp;quot;&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    set url [lindex $args end]&lt;br /&gt;
    set url [encoding convertfrom $charset $url]&lt;br /&gt;
    set url [encoding convertto identity $url]&lt;br /&gt;
&lt;br /&gt;
    switch -exact -- $mode {&lt;br /&gt;
        query {&lt;br /&gt;
            set result [::ns::url::encodeQuery $url]&lt;br /&gt;
        }&lt;br /&gt;
        url {&lt;br /&gt;
            set result [::ns::url::encodeUrl $url]&lt;br /&gt;
        }&lt;br /&gt;
        html {&lt;br /&gt;
            set result [::ns::url::encodeUrl $url]&lt;br /&gt;
            if { [string equal $mode html] } {&lt;br /&gt;
                set result [[string map [list \&lt;br /&gt;
                        &amp;amp;  {&amp;amp;amp;} \&lt;br /&gt;
                        &amp;lt;  {&amp;amp;lt;}  \&lt;br /&gt;
                        &amp;gt;  {&amp;amp;gt;}  \&lt;br /&gt;
                        \&amp;quot; {&amp;amp;quot;} ]] $result]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        default {&lt;br /&gt;
            error &amp;quot;should not happen&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return $result&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 proc ns_urldecode {args} {&lt;br /&gt;
    if { [llength $args] == 0 } {&lt;br /&gt;
        error &amp;quot;wrong # args: should be \&amp;quot;ns_urldecode ... data\&amp;quot;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    set charset utf-8&lt;br /&gt;
    set mode query&lt;br /&gt;
&lt;br /&gt;
    while { [llength $args] &amp;gt; 1 } {&lt;br /&gt;
        switch -exact -- [lindex $args 0] {&lt;br /&gt;
            -charset {&lt;br /&gt;
                set charset [lindex $args 1]&lt;br /&gt;
                set args [lrange $args 2 end]&lt;br /&gt;
            }&lt;br /&gt;
            default {&lt;br /&gt;
                error &amp;quot;invalid option \&amp;quot;[lindex $args 0]\&amp;quot;: should be\&lt;br /&gt;
                       \&amp;quot;ns_urldecode ... data\&amp;quot;&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    set url [lindex $args end]&lt;br /&gt;
    &lt;br /&gt;
    set matchList [regexp -all -inline {%([0-9a-fA-F]{2})} $url]&lt;br /&gt;
&lt;br /&gt;
    set mapList {+ { }}&lt;br /&gt;
    foreach {str code} $matchList {&lt;br /&gt;
        lappend mapList $str [format %c [scan $code %x]]&lt;br /&gt;
    }&lt;br /&gt;
    set url [string map $mapList $url]&lt;br /&gt;
    set url [encoding convertfrom $charset $url]&lt;br /&gt;
&lt;br /&gt;
    return $url&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 proc ::ns::url::encodeQuery {url} {&lt;br /&gt;
    set output &amp;quot;&amp;quot;&lt;br /&gt;
    #set encoding iso8859-1&lt;br /&gt;
    set re {^[a-zA-Z0-9 ]$}&lt;br /&gt;
&lt;br /&gt;
    foreach elem [split $url &amp;quot;&amp;quot;] {&lt;br /&gt;
        #if { ![string is alnum -strict $elem] } {}&lt;br /&gt;
        if { ![regexp $re $elem] } {&lt;br /&gt;
            scan $elem &amp;quot;%c&amp;quot; elem&lt;br /&gt;
            set elem %[format %x $elem]&lt;br /&gt;
        } elseif { [string equal &amp;quot; &amp;quot; $elem] } {&lt;br /&gt;
            set elem +&lt;br /&gt;
        }&lt;br /&gt;
        append output $elem&lt;br /&gt;
    }&lt;br /&gt;
    return $output&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 proc ::ns::url::encodeResource {url} {&lt;br /&gt;
    set output &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    set alphanum {[a-zA-Z0-9]}&lt;br /&gt;
    set mark {[-_.!~*'()]}&lt;br /&gt;
    set other {[:@&amp;amp;=+$,]}&lt;br /&gt;
    set special &amp;quot;\[/#\]&amp;quot;&lt;br /&gt;
            set re &amp;quot;${alphanum}|${mark}|${other}|${special}&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    set fragCount 0&lt;br /&gt;
    set index 0&lt;br /&gt;
    while { [set index [string first &amp;quot;#&amp;quot; $url $index]] &amp;gt;= 0 } {&lt;br /&gt;
        incr fragCount&lt;br /&gt;
        incr index&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    foreach elem [split $url &amp;quot;&amp;quot;] {&lt;br /&gt;
        if { ![regexp $re $elem] } {&lt;br /&gt;
            scan $elem &amp;quot;%c&amp;quot; elem&lt;br /&gt;
            set elem %[format %x $elem]&lt;br /&gt;
        } elseif { [string equal &amp;quot; &amp;quot; $elem] } {&lt;br /&gt;
            set elem %20&lt;br /&gt;
        } elseif { [string equal &amp;quot;#&amp;quot; $elem] &amp;amp;&amp;amp; ($fragCount &amp;gt; 1) } {&lt;br /&gt;
            set elem %23&lt;br /&gt;
            incr fragCount -1&lt;br /&gt;
        }&lt;br /&gt;
        append output $elem&lt;br /&gt;
    }&lt;br /&gt;
    return $output&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 proc ::ns::url::encodeQueryString {query} {&lt;br /&gt;
    set output &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    set outList {}&lt;br /&gt;
    foreach elem [split $query &amp;amp;] {&lt;br /&gt;
        set index [string first = $elem]&lt;br /&gt;
        if { $index &amp;gt;= 0 } {&lt;br /&gt;
            set key [string range $elem 0 [expr {$index -1}]]&lt;br /&gt;
            set value [string range $elem [expr {$index +1}] end]&lt;br /&gt;
            lappend outList &amp;quot;[encodeQuery $key]]=[[encodeQuery $value]&amp;quot;&lt;br /&gt;
        } else {&lt;br /&gt;
            lappend outList [encodeQuery $elem]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return [join $outList &amp;amp;]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 proc ::ns::url::encodeFragment {url} {&lt;br /&gt;
    set output &amp;quot;&amp;quot;&lt;br /&gt;
    set reserved {[;/?:@&amp;amp;=+$,]}&lt;br /&gt;
    set alphanum {[0-9a-zA-Z]}&lt;br /&gt;
    set mark {[-_.!~*'()]}&lt;br /&gt;
    set validRE &amp;quot;^(${reserved}|${alphanum}|${mark})*\$&amp;quot;&lt;br /&gt;
    set charRE &amp;quot;^${alphanum}|${mark}\$&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # Should we throw an error for an invalid fragment?&lt;br /&gt;
    # Are we even sure what an invalid fragment is?&lt;br /&gt;
&lt;br /&gt;
    foreach elem [split $url &amp;quot;&amp;quot;] {&lt;br /&gt;
        if { ![regexp $charRE $elem] } {&lt;br /&gt;
            scan $elem &amp;quot;%c&amp;quot; elem&lt;br /&gt;
            set elem %[format %x $elem]&lt;br /&gt;
        }&lt;br /&gt;
        append output $elem&lt;br /&gt;
    }&lt;br /&gt;
    return $output&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 proc ::ns::url::encodeUrl {url} {&lt;br /&gt;
    set urlRegexp {^((([^:/?#]]+):)?(//([[^/?#]]*))?([[^?#]]*))(\?([[^#]*))?(#(.*))?}&lt;br /&gt;
            &lt;br /&gt;
    if { ![[regexp $urlRegexp $url -&amp;gt; \&lt;br /&gt;
            resource p1 p2 p3 p4 p5 query p7 fragment p9]] } {&lt;br /&gt;
        error &amp;quot;Invalid url&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    set result [::ns::url::encodeResource $resource]&lt;br /&gt;
    if { [info exists query]] &amp;amp;&amp;amp; [[string length $query] } {&lt;br /&gt;
        if { ![info exists p7] } {&lt;br /&gt;
            set p7 &amp;quot;&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
        append result ?[::ns::url::encodeQueryString $p7]&lt;br /&gt;
    }&lt;br /&gt;
    if { [info exists fragment]] &amp;amp;&amp;amp; [[string length $fragment] } {&lt;br /&gt;
        if { ![info exists p9] } {&lt;br /&gt;
            set p9 &amp;quot;&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
        append result #[::ns::url::encodeFragment $p9]&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    return $result           &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 # ########################################&lt;br /&gt;
 # File: url.test&lt;br /&gt;
 package require tcltest&lt;br /&gt;
 namespace import tcltest::*&lt;br /&gt;
&lt;br /&gt;
 source url.tcl&lt;br /&gt;
&lt;br /&gt;
 # ========================================&lt;br /&gt;
 test encodeQueryString-1.1 {&lt;br /&gt;
    Break up the query string, and encode each section&lt;br /&gt;
 } -body {&lt;br /&gt;
    ::ns::url::encodeQueryString &amp;quot;arg1=value1&amp;amp;arg2=value2&amp;quot;&lt;br /&gt;
 } -result {arg1=value1&amp;amp;arg2=value2}&lt;br /&gt;
&lt;br /&gt;
 test encodeQueryString-1.2 {&lt;br /&gt;
    With an equal that needs escaping&lt;br /&gt;
 } -body {&lt;br /&gt;
    ::ns::url::encodeQueryString &amp;quot;arg1=value11=value12&amp;amp;arg2=value2&amp;quot;&lt;br /&gt;
 } -result {arg1=value11%3dvalue12&amp;amp;arg2=value2}&lt;br /&gt;
&lt;br /&gt;
 # ========================================&lt;br /&gt;
 test encode-1.1 {&lt;br /&gt;
    Basic encoding of url, in query mode&lt;br /&gt;
 } -body {&lt;br /&gt;
    ns_urlencode http://www.aolserver.com/&lt;br /&gt;
 } -result {http%3a%2f%2fwww%2eaolserver%2ecom%2f}&lt;br /&gt;
&lt;br /&gt;
 test encode-1.2 {&lt;br /&gt;
 } -body {&lt;br /&gt;
    ;# 0xe9 is the iso8859-1 for lowercase accented 'e'&lt;br /&gt;
    set data [ns_urlencode [format %c 0xe9]]&lt;br /&gt;
 } -result {%c3%a9}&lt;br /&gt;
&lt;br /&gt;
 test encode-2.1 {&lt;br /&gt;
    Test that query mode encodes the entire string as a query&lt;br /&gt;
 } -body {&lt;br /&gt;
    ns_urlencode &amp;quot;http://www.aolserver.com/bob?this is a=query&amp;quot;&lt;br /&gt;
 } -result {http%3a%2f%2fwww%2eaolserver%2ecom%2fbob%3fthis+is+a%3dquery}&lt;br /&gt;
&lt;br /&gt;
 test encode-3.1 {&lt;br /&gt;
    Mode url should not encode the url part with query rules&lt;br /&gt;
 } -body {&lt;br /&gt;
    ns_urlencode -url http://www.aolserver.com/bob&lt;br /&gt;
 } -result {http://www.aolserver.com/bob}&lt;br /&gt;
&lt;br /&gt;
 test encode-3.2 {&lt;br /&gt;
    Url mode, with a query component&lt;br /&gt;
 } -body {&lt;br /&gt;
    ns_urlencode -url {http://www.aolserver.com/bob?arg1 2}&lt;br /&gt;
 } -result {http://www.aolserver.com/bob?arg1+2}&lt;br /&gt;
&lt;br /&gt;
 test encode-3.3 {&lt;br /&gt;
    A space in the url part is escaped as %20, instead of a plus&lt;br /&gt;
 } -body {&lt;br /&gt;
    ns_urlencode -url {http://www.aolserver.com/p1 p2}&lt;br /&gt;
 } -result {http://www.aolserver.com/p1%20p2}&lt;br /&gt;
&lt;br /&gt;
 test encode-3.4 {&lt;br /&gt;
    The first equal sign of a query element need not be escaped&lt;br /&gt;
 } -body {&lt;br /&gt;
    ns_urlencode -url &amp;quot;page?arg1=value1&amp;quot;&lt;br /&gt;
 } -result {page?arg1=value1}&lt;br /&gt;
&lt;br /&gt;
 test encode-3.4 {&lt;br /&gt;
    The second equal sign in a query component needs to be escaped&lt;br /&gt;
 } -body {&lt;br /&gt;
    ns_urlencode -url &amp;quot;page?arg1=value1=value2&amp;quot;&lt;br /&gt;
 } -result {page?arg1=value1%3dvalue2}&lt;br /&gt;
&lt;br /&gt;
 test encode-3.5 {&lt;br /&gt;
    Multiple query elements get quoted ok&lt;br /&gt;
 } -body {&lt;br /&gt;
    ns_urlencode -url &amp;quot;page?arg1=value1&amp;amp;arg2=value 2&amp;quot;&lt;br /&gt;
 } -result {page?arg1=value1&amp;amp;arg2=value+2}&lt;br /&gt;
&lt;br /&gt;
 ## Fragments&lt;br /&gt;
 test encode-5.1 {&lt;br /&gt;
    Http, with fragment&lt;br /&gt;
 } -body {&lt;br /&gt;
    ns_urlencode -url &amp;quot;http://a.server.com/page#label&amp;quot;&lt;br /&gt;
 } -result {http://a.server.com/page#label}&lt;br /&gt;
&lt;br /&gt;
 test encode-5.2 {&lt;br /&gt;
    Http, with fragment and a # that needs escaping&lt;br /&gt;
 } -body {&lt;br /&gt;
    ns_urlencode -url &amp;quot;http://a.server.com/page#notlabel#label&amp;quot;&lt;br /&gt;
 } -result {http://a.server.com/page#notlabel%23label}&lt;br /&gt;
&lt;br /&gt;
 test encode-5.3 {&lt;br /&gt;
    Anything after the # is encoded as a fragment identifier&lt;br /&gt;
 } -body {&lt;br /&gt;
    ns_urlencode -url &amp;quot;http://a.server.com/page#sign?arg1=a&amp;quot;&lt;br /&gt;
 } -result &amp;quot;http://a.server.com/page#sign%3farg1%3da&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ## Mode: html&lt;br /&gt;
 # Used to encode a url for use in an html page&lt;br /&gt;
 # Otherwise, performs the same encodings as -url&lt;br /&gt;
 test encode-6.1 {&lt;br /&gt;
    Html mode, the &amp;amp; should be replaced by &amp;amp;amp;&lt;br /&gt;
 } -body {&lt;br /&gt;
    ns_urlencode -html &amp;quot;page?arg1=value1&amp;amp;arg2=value 2&amp;quot;&lt;br /&gt;
 } -result {page?arg1=value1&amp;amp;amp;arg2=value+2}&lt;br /&gt;
&lt;br /&gt;
 ## Special case tests&lt;br /&gt;
 test encode-7.1 {&lt;br /&gt;
    No encoding needed for ~&lt;br /&gt;
 } -body {&lt;br /&gt;
    ns_urlencode -url &amp;quot;ftp://a.server.com/~joe home%page&amp;quot;&lt;br /&gt;
 } -result {ftp://a.server.com/~joe%20home%25page}&lt;br /&gt;
&lt;br /&gt;
 test encode-7.2 {&lt;br /&gt;
    Empty query should still include the ?&lt;br /&gt;
 } -body {&lt;br /&gt;
    ns_urlencode -url &amp;quot;http://a.server.com/page?&amp;quot;&lt;br /&gt;
 } -result {http://a.server.com/page?}&lt;br /&gt;
&lt;br /&gt;
 test encode-7.3 {&lt;br /&gt;
    Empty fragment should still include the #&lt;br /&gt;
 } -body {&lt;br /&gt;
    ns_urlencode -url &amp;quot;http://a.server.com/page#&amp;quot;&lt;br /&gt;
 } -result {http://a.server.com/page#}&lt;br /&gt;
&lt;br /&gt;
 test encode-7.4 {&lt;br /&gt;
    Handle username@host:port&lt;br /&gt;
 } -body {&lt;br /&gt;
    ns_urlencode -url &amp;quot;ftp://rseeger@a.server.com:80/page&amp;quot;&lt;br /&gt;
 } -result {ftp://rseeger@a.server.com:80/page}&lt;br /&gt;
&lt;br /&gt;
 # ====================&lt;br /&gt;
 test encode-1.1E {&lt;br /&gt;
    Throw an error if no args are supplied&lt;br /&gt;
 } -body {&lt;br /&gt;
    ns_urlencode&lt;br /&gt;
 } -returnCodes error -match glob -result {wrong # args: should be *}&lt;br /&gt;
&lt;br /&gt;
 test encode-1.1E {&lt;br /&gt;
    Throw an error if invalid option is specified&lt;br /&gt;
 } -body {&lt;br /&gt;
    ns_urlencode -notvalid bob&lt;br /&gt;
 } -returnCodes error -match glob -result {invalid option &amp;quot;-notvalid&amp;quot;: should be *}&lt;br /&gt;
&lt;br /&gt;
 # ========================================&lt;br /&gt;
 &lt;br /&gt;
 test decode-1.1 {&lt;br /&gt;
    Basic decoding of url&lt;br /&gt;
 } -body {&lt;br /&gt;
    ns_urldecode http%3a%2f%2fwww%2eaolserver%2ecom%2f&lt;br /&gt;
 } -result {http://www.aolserver.com/}&lt;br /&gt;
&lt;br /&gt;
 test decode-1.2 {&lt;br /&gt;
    Don't decode characters twice&lt;br /&gt;
 } -body {&lt;br /&gt;
    # %23 is the code for #&lt;br /&gt;
    # %2523 is that, encoded&lt;br /&gt;
    ns_urldecode {%2523}&lt;br /&gt;
 } -result {%23}&lt;br /&gt;
&lt;br /&gt;
 test decode-2.1 {&lt;br /&gt;
    Decode with charset: utf-8 (the default)&lt;br /&gt;
 } -body {&lt;br /&gt;
    ns_urldecode -charset utf-8 %c3%a9&lt;br /&gt;
 } -result [format %c 0xe9]&lt;br /&gt;
&lt;br /&gt;
 test decode-2.2 {&lt;br /&gt;
    Decode with charset: iso8859-1&lt;br /&gt;
 } -body {&lt;br /&gt;
    string length [ns_urldecode -charset iso8859-1 %c3%a9]&lt;br /&gt;
 } -result 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dossy</name></author>
		
	</entry>
</feed>