Difference between revisions of "LlStringLength"
Jump to navigation
Jump to search
All Issues ~ Search JIRA for related Bugs
Omei Qunhua (talk | contribs) m (Corrected i.e. to e.g. (i.e. implies the one-and-only, e.g. means this is one example of a number)) |
Lady Sumoku (talk | contribs) m (Replaced old <LSL> block with <source lang="lsl2">) |
||
Line 11: | Line 11: | ||
|constants | |constants | ||
|examples= | |examples= | ||
< | <source lang="lsl2"> | ||
// assumptions: | // assumptions: | ||
// object name: LSLWiki | // object name: LSLWiki | ||
Line 28: | Line 28: | ||
} | } | ||
</ | </source> | ||
<hr> | <hr> | ||
*LSL-2 sees all strings as UTF8 | *LSL-2 sees all strings as UTF8 | ||
Line 36: | Line 36: | ||
*Some communication functions (e.g. llHTTPResponse) are limited by number of Bytes, and work with UTF8 strings | *Some communication functions (e.g. llHTTPResponse) are limited by number of Bytes, and work with UTF8 strings | ||
< | <source lang="lsl2"> | ||
integer getStringBytes(string msg) { | integer getStringBytes(string msg) { | ||
//Definitions: | //Definitions: | ||
Line 55: | Line 55: | ||
return llStringLength(t) * 2 - llStringLength(s); | return llStringLength(t) * 2 - llStringLength(s); | ||
} | } | ||
</ | </source> | ||
*Getting string bytes including multibyte characters | *Getting string bytes including multibyte characters | ||
:If we write bytes of msg and s as: | :If we write bytes of msg and s as: |
Revision as of 12:40, 22 January 2015
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Summary
Function: integer llStringLength( string str );128 | Function ID |
0.0 | Forced Delay |
10.0 | Energy |
Returns an integer that is the number of characters in str (not counting the null).
• string | str |
Caveats
- The index of the last character is not equal to the string length.
- Character indexs start at zero (the index of the first character is zero).
Examples
// 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 (e.g. 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);
}
- Getting string bytes including multibyte characters
- If we write bytes of msg and s as:
- mb(msg bytes) = nb(no escaped bytes) + bb(before escaped bytes)
- sb(s bytes) = nb + ab(after escaped bytes)
- And,
- ab = bb * 3 (each 1 byte like '#' becomes escaped to 3 bytes "%23"):
- Then,
- mb = sb - bb * 2
- All escaped in s are now "%xx"(x:0-9 or A-F) forms, so, bb = number of '%'s in s.
- To count '%'s, we make string t removing '%'s from s, and:
- bb = sb - tb(t bytes)
- (We separate s to a list removing '%'s by llParseString2List(), and again join to one string t by typecast.)
- Now we got answer:
- mb = sb - (sb - tb) * 2 = tb * 2 - sb
- Refer Blog(Japanese)
See Also
Functions
• | llGetListLength |