summary refs log tree commit diff stats
path: root/lib/pure
diff options
context:
space:
mode:
authorHans Raaf <hara@oderwat.de>2016-07-13 00:24:21 +0200
committerHans Raaf <hara@oderwat.de>2016-07-13 00:25:31 +0200
commit3cea6e8a96f1d0b012ab37d64cb40c562efaeb52 (patch)
treeae11d9f22508bdb47532596e2cc2bd49a098fdf1 /lib/pure
parent6111d2ec21ebfa33939abc91bc79ac329b9c95c7 (diff)
downloadNim-3cea6e8a96f1d0b012ab37d64cb40c562efaeb52.tar.gz
Added iterator for utf8 strings
Diffstat (limited to 'lib/pure')
-rw-r--r--lib/pure/unicode.nim16
1 files changed, 15 insertions, 1 deletions
diff --git a/lib/pure/unicode.nim b/lib/pure/unicode.nim
index b5383c5d3..0cbe8de7a 100644
--- a/lib/pure/unicode.nim
+++ b/lib/pure/unicode.nim
@@ -1572,7 +1572,7 @@ proc isTitle*(s: string): bool {.noSideEffect, procvar,
       firstRune = true
 
 iterator runes*(s: string): Rune =
-  ## Iterates over any unicode character of the string ``s``
+  ## Iterates over any unicode character of the string ``s`` returning runes
   var
     i = 0
     result: Rune
@@ -1580,6 +1580,14 @@ iterator runes*(s: string): Rune =
     fastRuneAt(s, i, result, true)
     yield result
 
+iterator utf8*(s: string): string =
+  ## Iterates over any unicode character of the string ``s`` returning utf8 values
+  var o = 0
+  while o < s.len:
+    let n = runeLenAt(s, o)
+    yield s[o.. (o+n-1)]
+    o += n
+
 proc toRunes*(s: string): seq[Rune] =
   ## Obtains a sequence containing the Runes in ``s``
   result = newSeq[Rune]()
@@ -1777,6 +1785,12 @@ when isMainModule:
   # test for rune positioning and runeSubStr()
   let s = "Hänsel  ««: 10,00€"
 
+  var t = ""
+  for c in s.utf8:
+    t.add c
+
+  doAssert(s == t)
+
   doAssert(runeReverseOffset(s, 1) == (20, 18))
   doAssert(runeReverseOffset(s, 19) == (-1, 18))