Another alternative would have been to store strings in UTF-8 and generate an array of indices to the starting point of each entity only if needed for random access. Subscripting a string would use the array of indices.<p>Only a few standard member functions of string (find, rfind, index, rindex) return integer subscripts into a string.  Those could return an opaque index object which has an index and a link to the string.  Such objects could be used for string operations which need a string index.  If an index object is forcibly converted to an integer, the array of indices has to be generated, but otherwise, it is unnecessary.  You could even allow adding or subtracting integers from an index object, which would walk the UTF-8 string forwards or backwards as indicated.<p>This would make UTF-8 strings usable with subscript and slice notation without exploding them to wide characters.