aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/encoding.cpp16
-rw-r--r--common/encoding.h12
2 files changed, 28 insertions, 0 deletions
diff --git a/common/encoding.cpp b/common/encoding.cpp
index fc743e5119..3c70f19334 100644
--- a/common/encoding.cpp
+++ b/common/encoding.cpp
@@ -499,4 +499,20 @@ uint32 *Encoding::transliterateUTF32(const uint32 *string, size_t length) {
return result;
}
+size_t Encoding::stringLength(const char *string, const String &encoding) {
+ if (encoding.hasPrefixIgnoreCase("UTF-16")) {
+ const uint16 *i = (const uint16 *) string;
+ for (;*i != 0; i++) {}
+ return (const char *) i - string;
+ } else if (encoding.hasPrefixIgnoreCase("UTF-32")) {
+ const uint32 *i = (const uint32 *) string;
+ for (;*i != 0; i++) {}
+ return (const char *) i - string;
+ } else {
+ const char *i = string;
+ for (;*i != 0; i++) {}
+ return i - string;
+ }
+}
+
}
diff --git a/common/encoding.h b/common/encoding.h
index 2b079ad962..adb61191d1 100644
--- a/common/encoding.h
+++ b/common/encoding.h
@@ -108,6 +108,18 @@ class Encoding {
* @return Array of characters with the opposite endianity
*/
static char *switchEndian(const char *string, int length, int bitCount);
+
+ /**
+ * Computes length (in bytes) of a string in a given encoding.
+ * The string must be zero ended. Similar to strlen
+ * (could be used instead of strlen).
+ *
+ * @param string String, which size should be computed.
+ * @param encoding Encoding of the string.
+ *
+ * @return Size of the string in bytes.
+ */
+ static size_t stringLength(const char *string, const String &encoding);
private:
/** The encoding, which is currently being converted to */