home *** CD-ROM | disk | FTP | other *** search
- #
- # $Id: Escape.pm,v 1.1 1997/11/18 00:33:39 neeri Exp $
- #
-
- package URI::Escape;
-
- =head1 NAME
-
- uri_escape - Escape unsafe characters
-
- uri_unescape - Unescape escaped characters
-
- =head1 SYNOPSIS
-
- use URI::Escape;
- $safe = uri_escape("10% is enough\n");
- $verysafe = uri_escape("foo", "\0-\377");
- $str = uri_unescape($safe);
-
- =head1 DESCRIPTION
-
- This module provide functions to escape and unescape URI strings.
- Some characters are regarded as "unsafe" and must be escaped in
- accordance with RFC 1738. Escaped characters are represented by a
- triplet consisting of the character "%" followed by two hexadecimal
- digits.
-
- The uri_escape() function takes an optional second argument that
- overrides the set of characters that are to be escaped. The set is
- specified as a string that can be used in a regular expression
- character class (between [ ]). E.g.:
-
- \x00-\x1f\x7f-\xff # all control and hi-bit characters
- a-z # all lower case characters
- ^A-Za-z # everything not a letter
-
- The default set of characters to be escaped is:
-
- \x00-\x20"#%;<>?{}|\\\\^~`\[\]\x7F-\xFF
-
- The module can also export the %escapes hash which contains the
- mapping from all characters to the corresponding escape code.
-
- =head1 SEE ALSO
-
- L<URI::URL>
-
- =cut
-
- require Exporter;
- @ISA = qw(Exporter);
- @EXPORT = qw(uri_escape uri_unescape);
- @EXPORT_OK = qw(%escapes);
-
- use Carp ();
-
- # Build a char->hex map
- for (0..255) {
- $escapes{chr($_)} = sprintf("%%%02X", $_);
- }
-
- sub uri_escape
- {
- my($text, $patn) = @_;
- return undef unless defined $text;
- if (defined $patn){
- unless (exists $subst{$patn}) {
- # Because we can't compile regex we fake it with a cached sub
- $subst{$patn} =
- eval "sub {\$_[0] =~ s/([$patn])/\$escapes{\$1}/g; }";
- Carp::croak("uri_escape: $@") if $@;
- }
- &{$subst{$patn}}($text);
- } else {
- # Default unsafe characters. (RFC1738 section 2.2)
- $text =~ s/([\x00-\x20"#%;<>?{}|\\\\^~`\[\]\x7F-\xFF])/$escapes{$1}/g; #"
- }
- $text;
- }
-
- sub uri_unescape
- {
- # Note from RFC1630: "Sequences which start with a percent sign
- # but are not followed by two hexadecimal characters are reserved
- # for future extension"
- my @copy = @_;
- for (@copy) { s/%([\dA-Fa-f]{2})/chr(hex($1))/eg; }
- wantarray ? @copy : $copy[0];
- }
-
- 1;
-