From 6d69c25a2feaa2285b85da5f8a4f65f0df5fe795 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 30 Oct 2019 20:43:37 +0200 Subject: [PATCH] Use locale encoding to decode subprocess output // Resolve #2890 --- platformio/compat.py | 5 +++++ platformio/proc.py | 11 +++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/platformio/compat.py b/platformio/compat.py index 37c63f2a..ac21016e 100644 --- a/platformio/compat.py +++ b/platformio/compat.py @@ -17,6 +17,7 @@ import inspect import json +import locale import os import re import sys @@ -30,6 +31,10 @@ def get_filesystem_encoding(): return sys.getfilesystemencoding() or sys.getdefaultencoding() +def get_locale_encoding(): + return locale.getdefaultlocale()[1] + + def get_class_attributes(cls): attributes = inspect.getmembers(cls, lambda a: not (inspect.isroutine(a))) return { diff --git a/platformio/proc.py b/platformio/proc.py index 85336be9..80e50201 100644 --- a/platformio/proc.py +++ b/platformio/proc.py @@ -19,7 +19,12 @@ from os.path import isdir, isfile, join, normpath from threading import Thread from platformio import exception -from platformio.compat import WINDOWS, get_filesystem_encoding, string_types +from platformio.compat import ( + WINDOWS, + get_filesystem_encoding, + get_locale_encoding, + string_types, +) class AsyncPipeBase(object): @@ -122,7 +127,9 @@ def exec_command(*args, **kwargs): for k, v in result.items(): if isinstance(result[k], bytes): try: - result[k] = result[k].decode(get_filesystem_encoding()) + result[k] = result[k].decode( + get_locale_encoding() or get_filesystem_encoding() + ) except UnicodeDecodeError: result[k] = result[k].decode("latin-1") if v and isinstance(v, string_types):