--- docutils/nodes.py +++ docutils/nodes.py @@ -27,6 +27,7 @@ import warnings import types import unicodedata +import locale # ============================== # Functional Node Base Classes @@ -328,6 +329,9 @@ else: def __new__(cls, data, rawsource=None): """Prevent the rawsource argument from propagating to str.""" + encoding = locale.getdefaultlocale()[1] + if isinstance(data, str) and encoding is not None: + data = data.decode(encoding) return reprunicode.__new__(cls, data) def __init__(self, data, rawsource=''): --- docutils/parsers/rst/directives/misc.py +++ docutils/parsers/rst/directives/misc.py @@ -10,6 +10,7 @@ import os.path import re import time +import locale from docutils import io, nodes, statemachine, utils from docutils.parsers.rst import Directive, convert_directive_function from docutils.parsers.rst import directives, roles, states @@ -66,8 +67,16 @@ input_encoding_error_handler), handle_io_errors=None) except IOError, error: - raise self.severe('Problems with "%s" directive path:\n%s: %s.' % - (self.name, error.__class__.__name__, str(error))) + if sys.version_info < (3,): + error_string = str(error) + encoding = locale.getdefaultlocale()[1] + if encoding is not None: + error_string = error_string.decode(encoding) + raise self.severe(u'Problems with "%s" directive path:\n%s: %s.' % + (self.name, error.__class__.__name__, error_string)) + else: + raise self.severe('Problems with "%s" directive path:\n%s: %s.' % + (self.name, error.__class__.__name__, str(error))) # Hack: Since Python 2.6, the string interpolation returns a # unicode object if one of the supplied %s replacements is a # unicode object. IOError has no `__unicode__` method and the --- tools/buildhtml.py +++ tools/buildhtml.py @@ -15,8 +15,8 @@ __docformat__ = 'reStructuredText' +import locale try: - import locale locale.setlocale(locale.LC_ALL, '') except: pass @@ -236,8 +236,19 @@ writer_name=pub_struct.writer_name, settings=settings) except ApplicationError, error: - print >>sys.stderr, (' Error (%s): %s' - % (error.__class__.__name__, error)) + if sys.version_info < (3,): + encoding = locale.getdefaultlocale()[1] + if isinstance(error.message, unicode) and encoding is not None: + error_message = (u' Error (%s): %s' + % (error.__class__.__name__, error)) + error_message = error_message.encode(encoding) + else: + error_message = (' Error (%s): %s' + % (error.__class__.__name__, error)) + print >>sys.stderr, error_message + else: + print >>sys.stderr, (' Error (%s): %s' + % (error.__class__.__name__, error)) if __name__ == "__main__":