Unpack the string at grapheme boundaries. Returns a list of character lists.
# File activesupport/lib/active_support/multibyte/chars.rb, line 467 def g_unpack(string) codepoints = u_unpack(string) unpacked =  pos = 0 marker = 0 eoc = codepoints.length while(pos < eoc) pos += 1 previous = codepoints[pos-1] current = codepoints[pos] if ( # CR X LF one = ( previous == UCD.boundary[:cr] and current == UCD.boundary[:lf] ) or # L X (L|V|LV|LVT) two = ( UCD.boundary[:l] === previous and in_char_class?(current, [:l,:v,:lv,:lvt]) ) or # (LV|V) X (V|T) three = ( in_char_class?(previous, [:lv,:v]) and in_char_class?(current, [:v,:t]) ) or # (LVT|T) X (T) four = ( in_char_class?(previous, [:lvt,:t]) and UCD.boundary[:t] === current ) or # X Extend five = (UCD.boundary[:extend] === current) ) else unpacked << codepoints[marker..pos-1] marker = pos end end unpacked end