As I said.. this and your original c-code will not work with UTF-8 at all. To make it work for UTF-8 you can use the [unicode.nim](http://forum.nim-lang.org///nim-lang.org/docs/unicode.html) module. But switching to UTF-8 and therefor Unicode will make all of that much more complex.
For example your input string will change its length (byte wise) because UTF-8 representation of chars will change. There are different ways to solve your problem. Even such, which do not at all use the unicode module and do not even "really" know about UTF-8 which even may be the best solution for your task. The most efficient solution for your exact problem would IMHO be an array of "utf-8" strings which get searched in your string while using two indices into the string. The first will be used to check if you find a replacement in the array the second is the position of the "resulting" string. You could also just create a new string but that would be slightly less efficient. If you do, make sure you preallocate the maximum space and setLen later for it. The procedure is pretty simple: Every time you find a replacement you advance the (raw) length of the found string (aka RuneLen) in the first index and add the replacement char (from a string which uses the index of the first array to carry the replacement chars) at the second index. if nothing is found you just copy one char and search again. As the result is always shorter than the original string that will work and end with the second index giving the new length of your string. It is slightly inefficient to do that scanning byte wise because you will also search for matching substrings inside of other UTF-8 encoded sequences. To avoid that you could use the same technique as the utf8 iterator uses: iterator utf8*(s: string): string = var o = 0 while o < s.len: let n = runeLenAt(s, o) yield s[o.. (o+n-1)] # <- this is what you need to search for and replace with your unacceted chars o += n I hope of being some help without writing a working version down :)