[phobos] UTF-8 string slicing

Jonathan M Davis jmdavisProg at gmx.com
Fri Aug 19 13:22:38 PDT 2011

On Friday, August 19, 2011 11:42 Masahiro Nakagawa wrote:
> On Sat, 20 Aug 2011 02:24:41 +0900, unDEFER <undefer at gmail.com> wrote:
> [snip]
> > The fact which the next code
> > ----
> > writeln( arr.length );
> > arr.popFront();
> > writeln( arr.length );
> > ----
> > prints 9 after 10 for any array but for UTF-8 and UTF-16 strings may
> > print as well 8 or lesser, seems too confusing for me.
> You can use std.algorithm.count to count the number of elements.
> assert([1,2,3].count() == 3);
> assert("abc".count() == 3);
> assert("あいう".count() == 3);

The correct function for getting the number of elements for a range is 
std.ronge.walkLength. count will call its predicate (which defaults to "true") 
on every member of the range. walkLength, on the other hand, will call the 
range's length property if it has one (string and wstring don't have a length 
property as far as ranges are concerned, because they're ranges of dchar, not 
char or wchar) and simply iterates through the range, counting its elements 
otherwise. So, it will be more efficient to call walkLength, and that's what 
it's for. count is for counting the number of elements in the range which 
match its predicate, not for counting the number of elements in the range.

- Jonathan M Davis

More information about the phobos mailing list