diff --git a/ChangeLog b/ChangeLog
index b004dcad27..e378f840ff 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Thu Nov 10 21:05:03 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* lib/shellwords.rb: fix for blank but not empty string.
+	  fixed: [ruby-dev:27663]
+
 Wed Nov  9 08:39:38 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* lib/shellwords.rb: refactored.  [ruby-core:06581]
diff --git a/lib/shellwords.rb b/lib/shellwords.rb
index 055a6a5be2..1d97cd62f2 100644
--- a/lib/shellwords.rb
+++ b/lib/shellwords.rb
@@ -26,22 +26,18 @@ module Shellwords
   # See the +Shellwords+ module documentation for an example.
   #
   def shellwords(line)
-    line = String.new(line) rescue
-      raise(ArgumentError, "Argument must be a string")
     words = []
     field = ''
-    last = 0
-    sep = nil
-    line.scan(/\G\s*(?:([^\s\\\'\"]+)|'([^\']*)'|"((?:[^\"\\]|\\.)*)"|(\\.?))(\s+|\z)?/m) do
-      last = $~.end(0)
-      sep = $~.begin(5)
-      field << ($1 || $2 || ($3 || $4).gsub(/\\(?=.)/, ''))
+    word = sq = dq = esc = garbage = sep = nil
+    line.scan(/\G\s*(?>([^\s\\\'\"]+)|'([^\']*)'|"((?:[^\"\\]|\\.)*)"|(\\.?)|(\S))(\s|\z)?/m) do
+      |word, sq, dq, esc, garbage, sep|
+      raise ArgumentError, "Unmatched double quote: #{line.inspect}" if garbage
+      field << (word || sq || (dq || esc).gsub(/\\(?=.)/, ''))
       if sep
         words << field
         field = ''
       end
     end
-    raise ArgumentError, "Unmatched double quote: #{line}" if line[last]
     words
   end