De DigiWiki.
// assumptions:
// object name: LSLWiki
// script name: _lslwiki
default
{
state_entry()
{
string HowLongAmI = "123";
integer strlen = llStringLength(HowLongAmI);
llOwnerSay( "'" + HowLongAmI + "' has " +(string) strlen + " characters.");
// The owner of object LSLWiki will hear
// LSLWiki: '123' has 3 characters.
}
}
- LSL-2 sees all strings as UTF8
- LSL-Mono sees all string as UTF16
- llStringLength gets the number of characters
- Both UTF8 and UTF16 use multibyte characters
- Some communication functions (i.e. llHTTPResponse) are limited by number of Bytes, and work with UTF8 strings
integer getStringBytes(string msg) {
//Definitions:
//msg == unescapable_chars + escapable_chars
//bytes == unescapable_bytes + escapable_bytes
//unescapable_bytes == unescapable_chars
//s == unescapable_chars + (escapable_bytes * 3)
string s = llEscapeURL(msg);//uses 3 characters per byte escaped.
//remove 1 char from each escapable_byte's triplet.
//t == unescapable_chars + (escapable_bytes * 2)
string t = (string)llParseString2List(s,["%"],[]);
//return == (unescapable_chars * 2 + escapable_bytes * 4) - (unescapable_chars + (escapable_bytes * 3))
//return == unescapable_chars + escapable_bytes == unescapable_bytes + escapable_bytes
//return == bytes
return llStringLength(t) * 2 - llStringLength(s);
}