> I prefer to see them only as a sequence of Unicode codepoints
You can still have this with encodings as data types.
Encoding is definitely a concern at the boundary, but to say that it is a concern only at the boundary is too simplistic. What if you want to save the cost of converting encodings from that which was input at the boundary? And at some point data will have to leave your application, and this often requires munging text in a number of encodings.
> So using a type system to specify encodings isn't really helpful
Imagine an error at compile time when you accidentally try to append an ISO-8859-1 string to a UTF-8 string.