One of common concepts of display, server and clients processes is display buffer. For client basic functions are provided to write buffer. Functions to allow remote sync of buffers are provided for all processes. Buffers contains unicode characters with attributes. Client uses one buffer per each allocated window. Server also has one buffer per client window + one for rootwindow (to display wallpapers and such) + one for entire screen. The last one is shared between server and display process. When sth gots changed in some client window, server updates buffer for entire screen and syncs it with display. All comunication, while doing buffer sync, is done in UCS-4, big endian (implementaion note: this removes requirements for display and server process to decode multibyte characters). Zlib compression is supported. On client side convinience functions are provided to allow drawing texts in buffers in several encodings.
Characters in buffers can be 0 or more physical characters long. For example combining diaeresis character can have width 0, V character - 1, and some Japanise characters can be 2 screen characters wide. Characters of width 0 change the meaning of previous character. Conversion table will be introduced in server or display process, that will allow displaying more characters then actual display device supports. However these converted characters can be wider the 1.
Note that unicode is used only when dealing with i/o. RPC names are simply 7 bit ASCII.