What type does byGrapheme() return?

Robert M. Münch robert.muench at saphirion.com
Sun Dec 29 12:19:09 UTC 2019


On 2019-12-27 19:44:59 +0000, H. S. Teoh said:

> Since graphemes are variable-length in terms of code points, you can't
> exactly *edit* a range of graphemes -- you can't replace a 1-codepoint
> grapheme with a 6-codepoint grapheme, for example, since there's no
> space in the underlying string to store that.

Hi, my idea was that when I use a grapheme range, it will abstract away 
that graphemes consist of different sized code-points. And the docs at 
https://dlang.org/phobos/std_uni.html#byGrapheme show an example using 
this kind of range:

auto gText = text.byGrapheme;

gText.take(3);
gText.drop(3);

But maybe I need to get a better understanding of the ranges stuff too...

> 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?

-- 
Robert M. Münch
http://www.saphirion.com
smarter | better | faster



More information about the Digitalmars-d-learn mailing list