cgi.rb Version 1.7.0についてです。

escapeとunescapeは下のパッチのようにした方が速いのでは
ないでしょうか?
http://www.din.or.jp/~ohzaki/perl.htm#JP_Escape 参照。

$1[0]の部分がこれで大丈夫なのかが自信がないのですが、
大丈夫でしょうか?


CGI::unescapeHTMLで'©'が消えてしまったり、'✏'で
RangeErrorになったりするのはまずいと思います。


CGI::escapeElement '<html>< html></html>'
 #=> "<html>&lt; html&gt;&lt;/html&gt;"

というのは意図した動作なのでしょうか?


CGI::rfc1123_date Time.gm 2000
  # Sat, 01 Jan 2000 00:00:00 GMT
となりますが例では
  # Sat, 1 Jan 2000 00:00:00 GMT
となっています。日のところは0がつくのとつかないのと
どっちが正しいのでしょうか?


http://www.w3.org/TR/REC-html40/strict.dtd
はHTML 4.01 Strict DTDになっているようなので、
4.0のURIに直すか4.01にするかした方がいいと思います。


--- 
ZnZ(ゼット エヌ ゼット)
西山和広(Kazuhiro Nishiyama)
mailto:zn / mbf.nifty.com



--- cgi.rb.orig Sat Aug 12 19:46:34 2000
+++ cgi.rb      Sat Aug 12 22:31:24 2000
@@ -243,7 +243,7 @@
       if " " == $1
         "+"
       else
-        sprintf("%%%02X", $1.unpack("C")[0])
+        sprintf("%%%02X", $1[0])
       end
     end
   end
@@ -255,7 +255,7 @@
 =end
   def CGI::unescape(string)
     string.gsub(/\+/n, ' ').gsub(/%([0-9a-fA-F]{2})/n) do
-      [$1.hex].pack("c")
+      $1.hex.chr
     end
   end

@@ -285,13 +285,24 @@
         if Integer($1) < 256
           Integer($1).chr
         else
-          if $KCODE[0] == ?u or $KCODE[0] == ?U
+          if Integer($1) < 65536 and ($KCODE[0] == ?u or $KCODE[0] == ?U)
             [Integer($1)].pack("U")
           else
-            "#" + $1
+            "&##{$1};"
           end
         end
-      when /\A#x([0-9a-f]+)\z/ni then $1.hex.chr
+      when /\A#x([0-9a-f]+)\z/ni then
+        if $1.hex < 256
+          $1.hex.chr
+        else
+          if $1.hex < 65536 and ($KCODE[0] == ?u or $KCODE[0] == ?U)
+            [$1.hex].pack("U")
+          else
+            "&#x#{$1};"
+          end
+        end
+      else
+        "&#{$1};"
       end
     end
   end
@@ -299,10 +310,10 @@

 =begin
 === ESCAPE ELEMENT
-  print CGI::escapeElement("<BR>", "A", "IMG")
+  print CGI::escapeElement('<BR>', "A", "IMG")
     # "<BR>&lt;A HREF="url"&gt;&lt;/A&gt"

-  print CGI::escapeElement("<BR>", ["A", "IMG"])
+  print CGI::escapeElement('<BR>', ["A", "IMG"])
     # "<BR>&lt;A HREF="url"&gt;&lt;/A&gt"
 =end
   def CGI::escapeElement(string, *element)
@@ -315,11 +326,11 @@
 =begin
 === UNESCAPE ELEMENT
   print CGI::unescapeElement(
-          CGI::escapeHTML("<BR>"), "A", "IMG")
+          CGI::escapeHTML('<BR>'), "A", "IMG")
     # "&lt;BR&gt;"

   print CGI::unescapeElement(
-          CGI::escapeHTML("<BR>"), ["A", "IMG"])
+          CGI::escapeHTML('<BR>'), ["A", "IMG"])
     # "&lt;BR&gt;"
 =end
   def CGI::unescapeElement(string, *element)
@@ -332,7 +343,7 @@
 =begin
 === MAKE RFC1123 DATE STRING
   CGI::rfc1123_date(Time.now)
-    # Sut, 1 Jan 2000 00:00:00 GMT
+    # Sat, 1 Jan 2000 00:00:00 GMT
 =end
   def CGI::rfc1123_date(time)
     t = time.clone.gmtime