diff --git a/Lib/optparse.py b/Lib/optparse.py
index 6b8f5d1..f0fad2c 100644
--- a/Lib/optparse.py
+++ b/Lib/optparse.py
@@ -16,7 +16,7 @@
 # Python developers: please do not make changes to this file, since
 # it is automatically generated from the Optik source code.
 
-__version__ = "1.5.1"
+__version__ = "1.5.1+"
 
 __all__ = ['Option',
            'SUPPRESS_HELP',
@@ -75,8 +75,8 @@
 
 
 # This file was generated from:
-#   Id: option_parser.py 509 2006-04-20 00:58:24Z gward
-#   Id: option.py 509 2006-04-20 00:58:24Z gward
+#   Id: option_parser.py 522 2006-06-11 16:22:03Z gward
+#   Id: option.py 522 2006-06-11 16:22:03Z gward
 #   Id: help.py 509 2006-04-20 00:58:24Z gward
 #   Id: errors.py 509 2006-04-20 00:58:24Z gward
 
@@ -256,7 +256,7 @@
                              text_width,
                              initial_indent=indent,
                              subsequent_indent=indent)
-
+        
     def format_description(self, description):
         if description:
             return self._format_text(description) + "\n"
@@ -1214,7 +1214,7 @@
         """
         Declare that you are done with this OptionParser.  This cleans up
         reference cycles so the OptionParser (and all objects referenced by
-        it) can be garbage-collected promptly.  After calling destroy(), the
+        it) can be garbage-collected promptly.  After calling destroy(), the 
         OptionParser is unusable.
         """
         OptionContainer.destroy(self)
@@ -1629,6 +1629,10 @@
         result.append(self.format_epilog(formatter))
         return "".join(result)
 
+    # used by test suite
+    def _get_encoding(self, file):
+        return getattr(file, "encoding", sys.getdefaultencoding())
+
     def print_help(self, file=None):
         """print_help(file : file = stdout)
 
@@ -1637,7 +1641,8 @@
         """
         if file is None:
             file = sys.stdout
-        file.write(self.format_help())
+        encoding = self._get_encoding(file)
+        file.write(self.format_help().encode(encoding, "replace"))
 
 # class OptionParser
 
diff --git a/Lib/test/test_optparse.py b/Lib/test/test_optparse.py
index 79df906..622d757 100644
--- a/Lib/test/test_optparse.py
+++ b/Lib/test/test_optparse.py
@@ -15,7 +15,7 @@
 import types
 import unittest
 
-from cStringIO import StringIO
+from StringIO import StringIO
 from pprint import pprint
 from test import test_support
 
@@ -164,15 +164,23 @@
                      expected_error=None):
         """Assert the parser prints the expected output on stdout."""
         save_stdout = sys.stdout
+        encoding = getattr(save_stdout, 'encoding', None)
         try:
             try:
                 sys.stdout = StringIO()
+                if encoding:
+                    sys.stdout.encoding = encoding
                 self.parser.parse_args(cmdline_args)
             finally:
                 output = sys.stdout.getvalue()
                 sys.stdout = save_stdout
 
         except InterceptedError, err:
+            self.assert_(
+                type(output) is types.StringType,
+                "expected output to be an ordinary string, not %r"
+                % type(output))
+
             if output != expected_output:
                 self.fail("expected: \n'''\n" + expected_output +
                           "'''\nbut got \n'''\n" + output + "'''")
@@ -1456,6 +1464,10 @@
         return InterceptingOptionParser(option_list=options)
 
     def assertHelpEquals(self, expected_output):
+        if type(expected_output) is types.UnicodeType:
+            encoding = self.parser._get_encoding(sys.stdout)
+            expected_output = expected_output.encode(encoding, "replace")
+
         save_argv = sys.argv[:]
         try:
             # Make optparse believe bar.py is being executed.
@@ -1486,6 +1498,27 @@
         self.parser = self.make_parser(60)
         self.assertHelpEquals(_expected_help_short_lines)
 
+    def test_help_unicode(self):
+        self.parser = InterceptingOptionParser(usage=SUPPRESS_USAGE)
+        self.parser.add_option("-a", action="store_true", help=u"ol\u00E9!")
+        expect = u"""\
+Options:
+  -h, --help  show this help message and exit
+  -a          ol\u00E9!
+"""
+        self.assertHelpEquals(expect)
+
+    def test_help_unicode_description(self):
+        self.parser = InterceptingOptionParser(usage=SUPPRESS_USAGE,
+                                               description=u"ol\u00E9!")
+        expect = u"""\
+ol\u00E9!
+
+Options:
+  -h, --help  show this help message and exit
+"""
+        self.assertHelpEquals(expect)
+
     def test_help_description_groups(self):
         self.parser.set_description(
             "This is the program description for %prog.  %prog has "
