diff --git a/IPython/core/magics/osm.py b/IPython/core/magics/osm.py index c29ed94..3f47517 100644 --- a/IPython/core/magics/osm.py +++ b/IPython/core/magics/osm.py @@ -31,7 +31,7 @@ from IPython.core.magic import ( Magics, compress_dhist, magics_class, line_magic, cell_magic, line_cell_magic ) from IPython.testing.skipdoctest import skip_doctest -from IPython.utils.io import file_read, nlprint +from IPython.utils.io import file_read, nlprint, source_to_unicode from IPython.utils.path import get_py_filename, unquote_filename from IPython.utils.process import abbrev_cwd from IPython.utils.terminal import set_term_title @@ -691,7 +691,7 @@ class OSMagics(Magics): print "Error: no such file, variable, URL, history range or macro" return - page.page(self.shell.pycolorize(cont)) + page.page(self.shell.pycolorize(source_to_unicode(cont))) @magic_arguments.magic_arguments() @magic_arguments.argument( diff --git a/IPython/utils/io.py b/IPython/utils/io.py index ec00a29..40a3b96 100644 --- a/IPython/utils/io.py +++ b/IPython/utils/io.py @@ -14,6 +14,7 @@ from __future__ import print_function #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- +import re import os import sys import tempfile @@ -154,6 +155,23 @@ class Tee(object): self.close() +def source_to_unicode(txt): + """Converts string with python source code to unicode + """ + if isinstance(txt, unicode): + return txt + + reg = re.compile("#.*coding[:=]\s*([-\w.]+)") + for row in txt.split("\n", 2)[:2]: #We only need to check the first two lines + result = reg.match(row) + if result: + coding = result.groups()[0] + break + else: + coding = "ascii" + return txt.decode(coding, errors="replace") + + def file_read(filename): """Read a file and close it. Returns the file source.""" fobj = open(filename,'r');