= attributed strings attribute lengths are rounded to complete unicode codepoints zero-length attributes are elided consecutive attributes of the same type and value are merged overlapping attributes of different types do not split each other overlapping attributes of the same type but different values do split empty string is allowed empty string cannot have attributes font family names are case-insensitive both in attributes and in descriptors attributes are unique throughout a Unicode codepoint, not just to UTF-8 bytes define what "it is an error" means in the case of uiFreeAttribute() and all uiAttributeValue() functions does uiAttributeFamily() return a normalized string