local utf8, _, env = {len = strlenutf8}, ...; env.utf8 = utf8; function utf8.size(char) return not char and 0 or char > 240 and 4 or char > 225 and 3 or char > 192 and 2 or 1; end function utf8.sub(str, startChar, numChars) local startIndex = 1; while startChar > 1 do local char = string.byte(str, startIndex) startIndex = startIndex + utf8.size(char) startChar = startChar - 1; end local currentIndex = startIndex; while numChars > 0 and currentIndex <= #str do local char = string.byte(str, currentIndex) currentIndex = currentIndex + utf8.size(char) numChars = numChars -1; end return str:sub(startIndex, currentIndex - 1) end function utf8.pos(text, position) local startIndex = 1; local curIndex = 0; while curIndex < position do local char = string.byte(text, startIndex) startIndex = startIndex + utf8.size(char) curIndex = curIndex + 1; end return startIndex - 1; end function utf8.getword(text, position) local altText = text:sub(1, position) .. ('\t') .. text:sub(position + 1); local startPos, endPos = altText:find("[%a']*\t[%a']*"); return (altText:sub(startPos, endPos):gsub('\t', '')), startPos, endPos - 1; end