On Thu, 11 Nov 2010 09:40:05 -0800
Andrei Alexandrescu <[email protected]> wrote:

> > string substring(string s, size_t beg, size_t end) // "logical slice" -
> > from code point number beg to code point number end  
> 
> That's not implemented and I don't think it would be useful. Usually 
> when I want a substring, the calculations up to that point indicate the 
> code _unit_ I'm at.

Yes, but a code unit does not represent a character, instead a unicode 
"abstract character".

void main() {
    dstring s = "\u0061\u0302\u006d\u0065"d;
    writeln(s);     // "âme"
    assert(s[0..1] == "a");
    assert(s.indexOf("â") == -1);
}

A "user-perceived character" (also strangely called "grapheme" in unicode docs) 
can be represented by an arbitrary number of code _units_ (up to 8 in their 
test data, but there is no actual limit). What a code unit represents is, say, 
a "scripting mark". In "â", there are 2 of them. For legacy reasons, UCS also 
includes "precombined characters", so that "â" can also be represented by a 
single code, indeed. But the above form is valid, it's even arguably the base 
form for "â" (and most composite chars cannot be represented by a single code).

In my views, there is a missing level of abstraction in common UString 
processing libs and types. How to count the "â"s in a text? How to find one? 
Above, indexOf fails because my editor uses a precombined code, while the 
source (here literal) uses another form.
To be able to produce meaningful results, and to use simple routines like 
index, find, count..., the way we used to with single-length character sets, 
there should be a grouping phase on top of decoding; we would then process 
arrays of "stacks" representing characters, not of codes. ITo search, it's also 
necessary to have all characters normalised form, so that both "â" would match: 
another phase.
Unicode provides algorithms for those phases in constructing string 
representations -- but everyone seems to ignore the issues... s[0..1] would 
then return the first character, not the first code of the "stack" representing 
the first character.


Denis
-- -- -- -- -- -- --
vit esse estrany ☣

spir.wikidot.com

Reply via email to