if utf8 == nil then utf8 = { charpattern = '[%z\x01-\x7F\xC2-\xF4][\x80-\xBF]*' } end local uc_lc = {['А']='а',['Б']='б',['В']='в',['Г']='г',['Д']='д',['Е']='е',['Ё']='ё',['Ж']='ж',['З']='з',['И']='и',['Й']='й',['К']='к',['Л']='л',['М']='м',['Н']='н',['О']='о',['П']='п',['Р']='р',['С']='с',['Т']='т',['У']='у',['Ф']='ф',['Х']='х',['Ц']='ц',['Ч']='ч',['Ш']='ш',['Щ']='щ',['Ъ']='ъ',['Ы']='ы',['Ь']='ь',['Э']='э',['Ю']='ю',['Я']='я'} local lc_uc = {} for uc, lc in pairs(uc_lc) do lc_uc[lc] = uc end setmetatable(uc_lc, {__index = function(_, char) return char:lower() end}) setmetatable(lc_uc, {__index = function(_, char) return char:upper() end}) function utf8.lower(text) return text:gsub(utf8.charpattern, uc_lc) end function utf8.upper(text) return text:gsub(utf8.charpattern, lc_uc) end