News for hackers. Stuff that matters.
Re:UCS vs. UTF-8 as Internal String Encoding by rectang on Thursday May 28, 2015 @11:10AM (#9618669)
Random-access idioms where unicode strings are treated as arrays of character data will result in userland code which is either incorrect or inefficient. Incorrect if the implementation cheats and treats variable-width data as constant-width, resulting in severing of logical units and incorrect length values. Inefficient, if each random-access operation counts variable-width elements from the beginning of the string.

It is better to provide string-manipulation facilities which rely on iteration and keep track of offset internally.

For an extended explanation, see Tom Christiansen's comment on this old Python issue: http://bugs.python.org/issue12729#msg142036

Re:UCS vs. UTF-8 as Internal String Encoding by geocar on Thursday May 28, 2015 @12:01PM (#9619034)
If we're iterating characters, we might as well use zlib-compressed 21-bit unicode characters. They save even more room than UTF8, and it's difficult to pretend that characters can be accessed by index.
Re:UCS vs. UTF-8 as Internal String Encoding by barrkel on Thursday May 28, 2015 @12:33PM (#9619280)
There's an order of magnitude difference (at least) between accessing memory vs unzipping. The constant space overhead isn't great either for small strings.

For big strings like web pages, we already do use zlib (via gzip).

Re:UCS vs. UTF-8 as Internal String Encoding by derefr on Thursday May 28, 2015 @11:41AM (#9618890)
How about a higher datatype abstraction, where you have a random-access array of glyphs that can be one or more composed unicode characters, each of which can be variable-length?
Re:UCS vs. UTF-8 as Internal String Encoding by masklinn on Thursday May 28, 2015 @11:51AM (#9618964)
Assuming by glyph you mean grapheme cluster (a glyph is something displayed on screen, talking about accessing glyphs makes absolutely no sense) there are issues with that:

1. you're added a layer of complexity to the system because now your strings are all rope-like, except they're not arbitrarily nested so they don't have the IO and compositional advantages of ropes

2. Unicode provides 3 classes of grapheme clusters (legacy, extended and tailored) at least one of which (tailored) is locale-dependent (`ch` is a single tailored grapheme cluster under the Slovak locale, because it's the ch digraph)

Re:UCS vs. UTF-8 as Internal String Encoding by derefr on Thursday May 28, 2015 @12:18PM (#9619177)
Both of these things are necessary, in the end, for the controller backing any text-editing control, right? A text-editing control is thinking in terms of "grapheme clusters", not in terms of codepoints. The codepoints come out of it when you ask it to export its current value, but otherwise, for layout and such, it's holding on to the moral equivalent of typesetting dice.

And, philosophically, I'd say that something close to (but not quite) this, is what people want to know from a lot of systems when they ask for a string's "length." They don't care how much memory the string is taking up (though they can have some low-level assertions to that effect); they care about whether the supplied text will fit in a given em-width container, or a given number of form blanks. This is what Twitter actually cares about these days; this is what wc(1) or Microsoft Word wants to tell you when you look at "character count"; this is what ncurses thinks in terms of in order to lay out monospaced text between various borders.

Now, ligatures and digraphs are a slight problem, in that people think of fl/fi/etc. as two characters, even if they are visually composed of one, but they don't think of, for example, ß as two characters. Thus why I said "glyph"—people expect "ss" to be two glyphs; "fi" to be two glyphs, and "ß" to be one glyph. On the other hand, they expect diacritics added to any of those things to not add any additional glyphs, even if they introduce kerning; the Japanese http://en.wikipedia.org/wiki/Sokuon, for example, is part of the glyph that follows it, even though it makes the word wider.

It's not a presentation-level characteristic, it's a "the way humans count things on the page" characteristic. But you can very easily build the presentation-level characteristic (grapheme cluster length) from it.

Which is all to say, maybe raw Unicode strings are good for systems languages—but in my day-to-day programming solving business-domain problems, I'd much rather be using a "text library" that provides "text objects" with a length measured in glyphs.

Re:UCS vs. UTF-8 as Internal String Encoding by masklinn on Thursday May 28, 2015 @01:04PM (#9619502)
> Both of these things are necessary, in the end, for the controller backing any text-editing control, right?

A controller backing a text-editing control can easily maintain an intermediate data structure mapping code points (or even code units) to whatever its unit of editing is.

> And, philosophically, I'd say that something close to (but not quite) this, is what people want to know from a lot of systems when they ask for a string's "length." They don't care how much memory the string is taking up (though they can have some low-level assertions to that effect); they care about whether the supplied text will fit in a given em-width container, or a given number of form blanks. This is what Twitter actually cares about these days; this is what wc(1) or Microsoft Word wants to tell you when you look at "character count"

Sure, I don't disagree about that.

> Thus why I said "glyph"—people expect "ss" to be two glyphs; "fi" to be two glyphs, and "ß" to be one glyph.

Except fi is a single glyph (but should be two grapheme clusters).

> Which is all to say, maybe raw Unicode strings are good for systems languages—but in my day-to-day programming solving business-domain problems, I'd much rather be using a "text library" that provides "text objects" with a length measured in glyphs.

That's a completely different concern, the internal representation and external interface to the string don't have to match. And in my experience, neither glyph length nor grapheme cluster length are of much use outside of providing a mostly pointless character count for a document. Useful metrics are encoded size (for storage) and rendered dimensions (to fit things to displays), the latter not being computable without more or less fully rendering the string anyway. Neither would benefit much or at all from a string representation with first-class grapheme clusters (let alone first-class glyphs)