On Sun, Dec 29, 2019 at 01:19:09PM +0100, Robert M. Münch via 
Digitalmars-d-learn wrote:
> On 2019-12-27 19:44:59 +0000, H. S. Teoh said:
[...]
> > If you want to add/delete/change graphemes, what you *really* want
> > is to use an array of Graphemes:
> > 
> >     Grapheme[] editableGraphs;
> > 
> > You can then splice it, insert stuff, delete stuff, whatever.
> > 
> > When you're done with it, convert it back to string with something
> > like this:
> > 
> >     string result = editableGraphs.map!(g => g[]).joiner.to!string;
> 
> I played around with this approach...
> 
> string r1 = "Robert M. Münch";
>       // Code-Units  = 16
>       // Code-Points = 15
>       // Graphemes   = 15
> 
> Grapheme[] gr1 = r1.byGrapheme.array;
> writeln(" Text = ", gr1.map!(g => g[]).joiner.to!string);
>       //  Text = obert M. Münch
> writeln("wText = ", gr1.map!(g => g[]).joiner.to!wstring);
>       //  wText = obert M. Münch
> writeln("dText = ", gr1.map!(g => g[]).joiner.to!dstring);
>       //  dText = obert M. Münch
> 
> Why is the first letter missing? Is this a bug?
[...]

I suspect there's a scope-related bug/issue somewhere here.  I did some
experiments and discovered that using foreach to iterate over a
Grapheme[] is OK, but somehow when using Grapheme[] with .map to slice
over each one, I get random UTF-8 encoding errors and missing
characters.

I suspect the cause is that whatever Grapheme.opSlice returns is going
out-of-scope when used with .map, that's why it's malfunctioning. The
last time I looked at the Grapheme code, there's a bunch of
memory-related stuff involving dtors that's *probably* the cause of this
problem.

Please file a bug for this.


T

-- 
Life is complex. It consists of real and imaginary parts. -- YHL

Reply via email to