diff -r b78de8029606 Lib/tarfile.py --- a/Lib/tarfile.py Mon Dec 16 23:10:50 2013 -0700 +++ b/Lib/tarfile.py Tue Dec 17 16:12:28 2013 +0800 @@ -1843,7 +1843,12 @@ print("%d-%02d-%02d %02d:%02d:%02d" \ % time.localtime(tarinfo.mtime)[:6], end=' ') - print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ') + try: + print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ') + except UnicodeEncodeError: + print(ascii(tarinfo.name).strip("'") + + ("/" if tarinfo.isdir() else ""), + end=' ') if verbose: if tarinfo.issym(): diff -r b78de8029606 Lib/test/test_tarfile.py --- a/Lib/test/test_tarfile.py Mon Dec 16 23:10:50 2013 -0700 +++ b/Lib/test/test_tarfile.py Tue Dec 17 16:12:28 2013 +0800 @@ -1786,6 +1786,11 @@ out = self.tarfilecmd(opt, tmpname) self.assertEqual(out, expected) + def test_list_print_lone_surrogate(self): + # Just make sure it does not throw UnicodeEncodeError exception + with tarfile.open(support.findfile('testtar.tar'), 'r') as tf: + tf.list(verbose=False) + def test_list_command_verbose(self): self.make_simple_tarfile(tmpname) with support.captured_stdout() as t: