diff --git a/stepmania/src/RageUtil.cpp b/stepmania/src/RageUtil.cpp index 189c8cbcb1..8cee098bd4 100644 --- a/stepmania/src/RageUtil.cpp +++ b/stepmania/src/RageUtil.cpp @@ -760,14 +760,29 @@ int masks[7] = { 0, 0x7f, 0x1f, 0x0f, 0x07, 0x03, 0x01 }; int utf8_get_char_len (const char *pp) { - const unsigned char *p = (const unsigned char *) pp; - if (*p < 128) return 1; - else if ((*p & 0xe0) == 0xc0) return 2; - else if ((*p & 0xf0) == 0xe0) return 3; - else if ((*p & 0xf8) == 0xf0) return 4; - else if ((*p & 0xfc) == 0xf8) return 5; - else if ((*p & 0xfe) == 0xfc) return 6; - return -1; + const unsigned char *p = (const unsigned char *) pp; + if (*p < 128) return 1; + else if ((*p & 0xe0) == 0xc0) return 2; + else if ((*p & 0xf0) == 0xe0) return 3; + else if ((*p & 0xf8) == 0xf0) return 4; + else if ((*p & 0xfc) == 0xf8) return 5; + else if ((*p & 0xfe) == 0xfc) return 6; + return -1; +} + +bool utf8_is_valid(const CString &str) +{ + unsigned pos = 0; + while(pos < str.size()) + { + int len = utf8_get_char_len(str.c_str() + pos); + if(len == -1) + return false; + + pos += len; + } + + return true; } wchar_t utf8_get_char (const char *p) diff --git a/stepmania/src/RageUtil.h b/stepmania/src/RageUtil.h index d3c088c0f1..8b9449e539 100644 --- a/stepmania/src/RageUtil.h +++ b/stepmania/src/RageUtil.h @@ -164,6 +164,7 @@ CString WcharToUTF8( wchar_t c ); wstring CStringToWstring(const CString &str); wchar_t utf8_get_char (const char *p); int utf8_get_char_len (const char *p); +bool utf8_is_valid(const CString &str); // Splits a CString into an CStringArray according the Deliminator. void split(