This is due to each russian character being treated as multiple unicode characters which were combined.
Looking at the sample of you provided, I would recommending using utf8.graphemes(), which provides an iterable of the start and end locations of each grapheme (visible character - in this case the russian letters):
local t = {}
local text = 'Привет'
for first, last in utf8.graphemes(text) do
table.insert(t, string.sub(text, first, last))
end
print(t)