Abstraction exists only in the mind as (empty) placeholder template for real object with a skeleton form(structure) filled by data(information). Without concrete objects and data its an idea (fantasy) of what one wants to accomplish(desire). We transform the idea into pseudocode and specifications, guided by the abstractions towards implementation of concrete programs and libraries operating on the assumption that the abstraction is a perfect form(its not, its just creators ideas turned into
http://en.wikipedia.org/wiki/Reification_%28fallacy%29 ). Bugs and quirks are assumed as the problems of the implementation "properly implemented abstraction", like "sufficiently smart compiler" and "reasonable normal people" writing "pseudocode that maps to reality". So the abstraction layer pileup starts.
0.Unicode is treated as concrete static authority holding the correct placement of languages and symbols, which isn't reality.
1.UTF-8 encoding as an idea of "efficient storage of unicode characters".
2.UTF-8 as standard convention: UTF-8 is defined as "variable width stream of bytes that are convertible to unicode code points"
3.UTF-8 interface: UTF-8 library interface(typically handles all types of unicode)
4.UTF-8 code: concrete code which converts, parses or manipulates UTF-8 strings.
5.UTF-8 program: builds on #4 to process UTF-8 encoded text
6.UTF-8 programmer:writes programs blissfully unaware of abstractions below.
7. Until the program gets a dose of reality, the text reversed in random placed because of RTL directions or gets weird punctuation above letters(ala Zalgo texts), letters get bunched up into a cluster and string functions suddenly begin corrupting text.
8. The "programmer" is forced to see inside the abstraction and discover its "perfect form" is quite unlike the idea.
9.The inevitable conclusion is that all abstraction is merely illusion and hiding information is security by obscurity.