So it sounds like you're encountering the richness and complexity that NSString supports. It's a deep subject.
All strings are stored as some sort of array in reality and have encoding that maps the array elements values to characters.
NSString hides this complexity well most of the time because it is hard to learn and do well manually and few people really can. It's also way more interesting to just not have to think about it most of the time and do other stuff.
However, NSString internally keeps an array of Unichars. When you create a string from another string from an external source that is not already an NSString, you need to know the encoding. Otherwise garbage in garbage out.
UTF8 happens to be really robust and not sensitive to things like byte order, so it's gained wide adoption on the web and in XML.
It's not ideal for all situations so platform native frameworks tend to use UTF16 or 32 for certain optimizations.
You might say it's the encoding of files. (Horrible generalization) and that UTF16 and 32 with their byte order concerns are the encoding of hardware specific processing power. (Another bad generalization)
Wikipedia has a great entry on Unicode encodings and on UTF8 in particular.
It's a good place to start your adventure.