#!/usr/bin/env perl use strict; use warnings; use URI 5.17; use URI::Escape 5.17; print "OS[$^O] perl[$^V]\n"; # uri_escape() gives %20 my $str = '2022-12-18 12:19:57'; print "\$str[$str]\n"; my $esc_str = uri_escape($str); print "\$esc_str[$esc_str]\n"; # query_param() gives + { my $u = URI->new('/api/Data', 'http'); print 'URI init=[', $u->as_string(), "]\n"; $u->query_param(t1 => '2022-12-18 12:19:57'); print 'URI raw_param=[', $u->as_string(), "]\n"; } # If escaped string is used, %20 -> %2520 { my $u = URI->new('/api/Data', 'http'); $u->query_param(t1 => $esc_str); print 'URI esc_param=[', $u->as_string(), "]\n"; } # If string escaped in situ, still %20 -> %2520 { my $u = URI->new('/api/Data', 'http'); $u->query_param(t1 => uri_escape('2022-12-18 12:19:57')); print 'URI in_situ_esc_param=[', $u->as_string(), "]\n"; } # You can modify the query string to change + to %20 { my $u = URI->new('/api/Data', 'http'); $u->query_param(t1 => '2022-12-18 12:19:57'); my $query = $u->query(); $query =~ s/\+/%20/g; $u->query($query); print 'URI long_re_sub_param=[', $u->as_string(), "]\n"; } # Perl 5.14 and later has the /r modifier: # use for a more succinct version of the above # with identical output. { my $u = URI->new('/api/Data', 'http'); $u->query_param(t1 => '2022-12-18 12:19:57'); $u->query($u->query() =~ s/\+/%20/gr); print 'URI rmod_re_sub_param=[', $u->as_string(), "]\n"; } #### OS[cygwin] perl[v5.36.0] $str[2022-12-18 12:19:57] $esc_str[2022-12-18%2012%3A19%3A57] URI init=[/api/Data] URI raw_param=[/api/Data?t1=2022-12-18+12%3A19%3A57] URI esc_param=[/api/Data?t1=2022-12-18%252012%253A19%253A57] URI in_situ_esc_param=[/api/Data?t1=2022-12-18%252012%253A19%253A57] URI long_re_sub_param=[/api/Data?t1=2022-12-18%2012%3A19%3A57] URI rmod_re_sub_param=[/api/Data?t1=2022-12-18%2012%3A19%3A57]