Difference between revisions of "LlStringLength"

From Second Life Wiki
Jump to: navigation, search
m
m (Replaced old <LSL> block with <source lang="lsl2">)
 
(5 intermediate revisions by 4 users not shown)
Line 6: Line 6:
 
|return_text=that is the number of characters in '''str''' (not counting the null).
 
|return_text=that is the number of characters in '''str''' (not counting the null).
 
|spec
 
|spec
|caveats
+
|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).
 
|constants
 
|constants
 
|examples=
 
|examples=
 
+
<source lang="lsl2">
Note: In LSL, many times the counting starts at zero. With llStringLength(), it actually starts at 1.
+
 
+
<lsl>
+
 
// assumptions:  
 
// assumptions:  
 
//    object name: LSLWiki
 
//    object name: LSLWiki
Line 28: Line 27:
 
     }
 
     }
 
}
 
}
</lsl>
+
 
 +
</source>
 +
<hr>
 +
*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
 +
 
 +
<source lang="lsl2">
 +
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);
 +
}
 +
</source>
 +
*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)
 +
:http://snumaw.blogspot.jp/2009/01/lsl-lldialog.html
 +
:http://jinko.slmame.com/e602732.html
 +
 
 
|helpers
 
|helpers
 
|also_functions={{LSL DefineRow||[[llGetListLength]]|}}
 
|also_functions={{LSL DefineRow||[[llGetListLength]]|}}

Latest revision as of 11:40, 22 January 2015

Summary

Function: integer llStringLength( string str );

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).
All Issues ~ Search JIRA for related Bugs

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)
http://snumaw.blogspot.jp/2009/01/lsl-lldialog.html
http://jinko.slmame.com/e602732.html

See Also

Functions

•  llGetListLength

Deep Notes

Search JIRA for related Issues

Signature

function integer llStringLength( string str );