From 492cefacb6a242dc9a7eca3bbfe8f8bace635bd4 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 8 Nov 2013 12:03:41 +0200 Subject: [PATCH] WINTERMUTE: Allow utf8ToWide() and wideToUtf8() work with ASCII strings This is needed for English versions of multilingual games, which use UTF-8 strings, but we can treat them as plain ASCII, since wide and UTF-8 strings are not yet supported in Wintermute. This allows at least the English versions of these games to run. This allows Reversion 2 and Shaban to start --- engines/wintermute/utils/string_util.cpp | 47 +++++++++++++++++++++++- engines/wintermute/utils/string_util.h | 1 + 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/engines/wintermute/utils/string_util.cpp b/engines/wintermute/utils/string_util.cpp index e8e078aba89b..c359b1f96105 100644 --- a/engines/wintermute/utils/string_util.cpp +++ b/engines/wintermute/utils/string_util.cpp @@ -48,9 +48,41 @@ bool StringUtil::compareNoCase(const AnsiString &str1, const AnsiString &str2) { return (str1lc == str2lc); }*/ +bool StringUtil::isAscii(Common::String &str) { + uint strSize = str.size(); + Common::String punctuation("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"); + + for (uint32 i = 0; i < str.size(); i++) { + if (!Common::isAlnum(str[i]) && str[i] != ' ' && !punctuation.contains(str[i])) { + // Replace some UTF-8 characters with (almost) equivalent ANSII ones + if ((byte)str[i] == 0xc2 && i + 1 < str.size() && (byte)str[i + 1] == 0xa9) { + // UTF-8 copyright character, substitute with 'c' + str.deleteChar(i); + str.setChar('c', i); + strSize--; + } else { + return false; + } + } + } + + return true; +} + ////////////////////////////////////////////////////////////////////////// WideString StringUtil::utf8ToWide(const Utf8String &Utf8Str) { - error("StringUtil::Utf8ToWide - WideString not supported yet"); + // WORKAROUND: Since wide strings aren't supported yet, we make this function + // work at least with ASCII strings. This should cover all English versions. + Common::String asciiString = Utf8Str; + if (isAscii(asciiString)) { + // No special (UTF-8) characters found, just return the string + return asciiString; + } else { + warning("String contains special (UTF-8) characters: '%s'", Utf8Str.c_str()); + } + + error("StringUtil::Utf8ToWide - WideString not supported yet for UTF-8 characters"); + /* size_t WideSize = Utf8Str.size(); if (sizeof(wchar_t) == 2) { @@ -99,7 +131,18 @@ WideString StringUtil::utf8ToWide(const Utf8String &Utf8Str) { ////////////////////////////////////////////////////////////////////////// Utf8String StringUtil::wideToUtf8(const WideString &WideStr) { - error("StringUtil::wideToUtf8 - Widestring not supported yet"); + // WORKAROUND: Since UTF-8 strings aren't supported yet, we make this function + // work at least with ASCII strings. This should cover all English versions. + Common::String asciiString = WideStr; + if (isAscii(asciiString)) { + // No special (UTF-8) characters found, just return the string + return asciiString; + } else { + warning("String contains special (UTF-8) characters: '%s'", WideStr.c_str()); + } + + error("StringUtil::wideToUtf8 - WideString not supported yet for UTF-8 characters"); + /* size_t WideSize = WideStr.length(); if (sizeof(wchar_t) == 2) { diff --git a/engines/wintermute/utils/string_util.h b/engines/wintermute/utils/string_util.h index 3ae5e4749324..3ced6aa93379 100644 --- a/engines/wintermute/utils/string_util.h +++ b/engines/wintermute/utils/string_util.h @@ -37,6 +37,7 @@ class StringUtil { public: static bool compareNoCase(const AnsiString &str1, const AnsiString &str2); //static bool compareNoCase(const WideString &str1, const WideString &str2); + static bool isAscii(Common::String &str); static WideString utf8ToWide(const Utf8String &Utf8Str); static Utf8String wideToUtf8(const WideString &WideStr); static WideString ansiToWide(const AnsiString &str);