From 0697a0dd5be7ace3838303a9de2c13f633b31312 Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Sat, 15 Apr 2023 13:05:57 -0700 Subject: [PATCH] Fix file encoding for some loads. We've actually been pretty good at getting this right in most of the code base, but we've missed it in a few places. Python defaults to the encoding of the current locale unless otherwise specified, and for a US English Windows install that's cp1252, not UTF-8. I'm not brave enough to change the locale at startup because I don't know how that might affect CJK encoding users (or for that matter, non-Latin derived alphabet UTF-8 variants). Fixes https://github.com/dcs-liberation/dcs_liberation/issues/2786. --- changelog.md | 5 +++++ game/campaignloader/campaign.py | 2 +- game/logging_config.py | 2 +- game/theater/theaterloader.py | 4 ++-- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/changelog.md b/changelog.md index d17a2c1a..23eb1f62 100644 --- a/changelog.md +++ b/changelog.md @@ -138,6 +138,11 @@ Saves from 6.x are not compatible with 7.0. ## Fixes +* **[Campaign]** Fixed a longstanding bug where oversized airlifts could corrupt a save with empty convoys. +* **[Modding]** Fixed an issue where Falklands campaigns created or edited with new versions of DCS could not be loaded. +* **[Modding]** Fixed decoding of campaign yaml files to use UTF-8 rather than the system locale's default. It's now possible to use "Bf 109 K-4 Kurfürst" as a preferred aircraft type. + + # 6.1.1 ## Fixes diff --git a/game/campaignloader/campaign.py b/game/campaignloader/campaign.py index e93df4dd..61ee926f 100644 --- a/game/campaignloader/campaign.py +++ b/game/campaignloader/campaign.py @@ -60,7 +60,7 @@ class Campaign: @classmethod def from_file(cls, path: Path) -> Campaign: - with path.open() as campaign_file: + with path.open(encoding="utf-8") as campaign_file: data = yaml.safe_load(campaign_file) sanitized_theater = data["theater"].replace(" ", "") diff --git a/game/logging_config.py b/game/logging_config.py index 1774ee30..0a42b817 100644 --- a/game/logging_config.py +++ b/game/logging_config.py @@ -16,7 +16,7 @@ def init_logging(version: str) -> None: log_config = resources / "default_logging.yaml" if (custom_log_config := resources / "logging.yaml").exists(): log_config = custom_log_config - with log_config.open() as log_file: + with log_config.open(encoding="utf-8") as log_file: logging.config.dictConfig(yaml.safe_load(log_file)) logging.info(f"DCS Retribution {version}") diff --git a/game/theater/theaterloader.py b/game/theater/theaterloader.py index 075d1873..1534db83 100644 --- a/game/theater/theaterloader.py +++ b/game/theater/theaterloader.py @@ -96,13 +96,13 @@ class TheaterLoader: @property def menu_thumbnail_dcs_relative_path(self) -> Path: - with self.descriptor_path.open() as descriptor_file: + with self.descriptor_path.open(encoding="utf-8") as descriptor_file: data = yaml.safe_load(descriptor_file) name = data.get("pydcs_name", data["name"]) return Path("Mods/terrains") / name / "Theme/icon.png" def load(self) -> ConflictTheater: - with self.descriptor_path.open() as descriptor_file: + with self.descriptor_path.open(encoding="utf-8") as descriptor_file: data = yaml.safe_load(descriptor_file) return ConflictTheater( TERRAINS_BY_NAME[data.get("pydcs_name", data["name"])],