Functionally, a string is a list, or sequence, of characters. Strings are often stored transparently as character arrays (e.g., in C), so we often refer to them that way. Arrays allow convenient random access to the characters, which is important for some algorithms.
For other purposes, though, storing Unicode strings as UTF-8 might be the most appropriate form. Note that, although it's stored in a byte array, there's no longer a one-to-one correspondence between bytes and characters: your string algorithms generally need to access the characters sequentially from the beginning -- as a list.
The moral of this story is: your string code should only demand random access if it actually needs it. You might be surprised how seldom you really need an array of characters.