From 793e83779f86e45d96065a30732e43a274710934 Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 4 Jul 2016 19:03:30 +0100 Subject: [PATCH] handle RCT2 language encoding properly --- src/localisation/language.cpp | 9 +++++++++ src/localisation/language.h | 1 + src/object/StringTable.cpp | 14 +++++++------- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/localisation/language.cpp b/src/localisation/language.cpp index 976261de7b..d154358954 100644 --- a/src/localisation/language.cpp +++ b/src/localisation/language.cpp @@ -322,6 +322,15 @@ static bool rct2_language_is_multibyte_charset(int languageId) } } +utf8 *rct2_language_string_to_utf8(const char *src, int languageId) +{ + if (rct2_language_is_multibyte_charset(languageId)) { + return convert_multibyte_charset(src, languageId); + } else { + return win1252_to_utf8_alloc(src); + } +} + bool language_get_localised_scenario_strings(const utf8 *scenarioFilename, rct_string_id *outStringIds) { outStringIds[0] = _languageCurrent->GetScenarioOverrideStringId(scenarioFilename, 0); diff --git a/src/localisation/language.h b/src/localisation/language.h index 153dd1481a..c509c7b37e 100644 --- a/src/localisation/language.h +++ b/src/localisation/language.h @@ -79,6 +79,7 @@ int utf8_length(const utf8 *text); wchar_t *utf8_to_widechar(const utf8 *src); utf8 *widechar_to_utf8(const wchar_t *src); +utf8 *rct2_language_string_to_utf8(const char *src, int languageId); bool language_get_localised_scenario_strings(const utf8 *scenarioFilename, rct_string_id *outStringIds); rct_string_id language_allocate_object_string(const utf8 * target); void language_free_object_string(rct_string_id stringId); diff --git a/src/object/StringTable.cpp b/src/object/StringTable.cpp index 0f1642d40f..88ed280d1d 100644 --- a/src/object/StringTable.cpp +++ b/src/object/StringTable.cpp @@ -56,17 +56,17 @@ void StringTable::Read(IReadObjectContext * context, IStream * stream, uint8 id) entry.Id = id; entry.LanguageId = languageId; - char * win1252 = stream->ReadString(); - if (StringIsBlank(win1252)) + char * stringAsWin1252 = stream->ReadString(); + utf8 * stringAsUtf8 = rct2_language_string_to_utf8(stringAsWin1252, languageId); + Memory::Free(stringAsWin1252); + + if (StringIsBlank(stringAsUtf8)) { entry.LanguageId = RCT2_LANGUAGE_ID_BLANK; } + String::Trim(stringAsUtf8); - entry.Text = win1252_to_utf8_alloc(win1252); - Memory::Free(win1252); - - String::Trim(entry.Text); - + entry.Text = stringAsUtf8; _strings.push_back(entry); } }