I hesitated before writing about the byte level, but S02 explictly mentions it:
in reply to Re^3: How to reverse a (Unicode) string
in thread How to reverse a (Unicode) string
also ask for the total string length of an array's elements, in bytes,
codepoints or graphemes, using these methods .bytes, .codes or .graphs
respectively on the array. The same methods apply to strings as well.
And of course you have a byte level if you specify an encoding, or if there is a default one. Just like you can have a language dependent notion of a grapheme if you pick a language.
But I think the spec should be a bit clearer regarding how the character encoding is chosen.