From c7ee8560d3f1d50136b7bfc1e519c18f90eb10bf Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Sun, 16 Feb 2014 13:35:16 -0500 Subject: [PATCH] Fixes for locale issues There were some problems when a level.dat contained a non-ascii name, or when a level.dat lived in a directory with a non-ascii name. Paths returned by os.listdir are encoded, so we need to decode them before printing them. When calculating the max length of the enumerated world names, were we for some reason calling str() before taking the len(). The had the effect of converting unicode strings into non-unicode strings, which is not the correct thing to do. --- overviewer.py | 2 +- overviewer_core/world.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/overviewer.py b/overviewer.py index a9cd057..915dc39 100755 --- a/overviewer.py +++ b/overviewer.py @@ -525,7 +525,7 @@ def list_worlds(): print("Detected saves:") # get max length of world name - worldNameLen = max([len(str(x)) for x in worlds] + [len("World")]) + worldNameLen = max([len(x) for x in worlds] + [len("World")]) formatString = "%-" + str(worldNameLen) + "s | %-8s | %-8s | %-16s | %s " print(formatString % ("World", "Size", "Playtime", "Modified", "Path")) diff --git a/overviewer_core/world.py b/overviewer_core/world.py index 9c2bc86..d958fd3 100644 --- a/overviewer_core/world.py +++ b/overviewer_core/world.py @@ -21,6 +21,7 @@ import hashlib import time import random import re +import locale import numpy @@ -734,6 +735,7 @@ def get_worlds(): "Returns {world # or name : level.dat information}" ret = {} save_dir = get_save_dir() + loc = locale.getpreferredencoding() # No dirs found - most likely not running from inside minecraft-dir if not save_dir is None: @@ -741,7 +743,7 @@ def get_worlds(): world_dat = os.path.join(save_dir, dir, "level.dat") if not os.path.exists(world_dat): continue info = nbt.load(world_dat)[1] - info['Data']['path'] = os.path.join(save_dir, dir) + info['Data']['path'] = os.path.join(save_dir, dir).decode(loc) if dir.startswith("World") and len(dir) == 6: try: world_n = int(dir[-1]) @@ -755,7 +757,7 @@ def get_worlds(): world_dat = os.path.join(dir, "level.dat") if not os.path.exists(world_dat): continue info = nbt.load(world_dat)[1] - info['Data']['path'] = os.path.join(".", dir) + info['Data']['path'] = os.path.join(".", dir).decode(loc) if 'LevelName' in info['Data'].keys(): ret[info['Data']['LevelName']] = info['Data']