[Scummvm-cvs-logs] scummvm master -> 492cefacb6a242dc9a7eca3bbfe8f8bace635bd4

bluegr bluegr at gmail.com
Fri Nov 8 11:04:46 CET 2013


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
492cefacb6 WINTERMUTE: Allow utf8ToWide() and wideToUtf8() work with ASCII strings


Commit: 492cefacb6a242dc9a7eca3bbfe8f8bace635bd4
    https://github.com/scummvm/scummvm/commit/492cefacb6a242dc9a7eca3bbfe8f8bace635bd4
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2013-11-08T02:04:07-08:00

Commit Message:
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

Changed paths:
    engines/wintermute/utils/string_util.cpp
    engines/wintermute/utils/string_util.h



diff --git a/engines/wintermute/utils/string_util.cpp b/engines/wintermute/utils/string_util.cpp
index e8e078a..c359b1f 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 3ae5e47..3ced6aa 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);






More information about the Scummvm-git-logs mailing list