我需要一个功能 function getCharType(c) local i = string.byte(c) -- works only for 1 byte chars if (i 48) and (i 57) then return 1 end if (i 97) and (i 122) then return 2 end return 0end 应该返回 2 - if c is a letter1 - if c is a
function getCharType(c) local i = string.byte(c) -- works only for 1 byte chars if (i > 48) and (i < 57) then return 1 end if (i > 97) and (i < 122) then return 2 end return 0 end
应该返回
2 - if c is a letter 1 - if c is a digit 0 - if c is a symbol (anything else)
c本身已经是小写字符:charType = getCharType(string.lower(Character)).如果可以使用Unicode字符,那就没问题了.
上面的getCharType(“ö”)是0.
要确定非ASCII字符是大写还是小写字母还是数字,您需要Unicode数据.维基百科上的 Module:Unicode data具有这样的函数,它使用 Module:Unicode data/category( General Category的Unicode字符的数据).以下是Module:Unicode数据中lookup_category函数的改编.我没有包含Unicode数据(模块:Unicode数据/类别);你必须从上面的链接复制它.
local category_data -- set this variable to the text of Module:Unicode data/category above local floor = math.floor local function binary_range_search(code_point, ranges) local low, mid, high low, high = 1, #ranges while low <= high do mid = floor((low + high) / 2) local range = ranges[mid] if code_point < range[1] then high = mid - 1 elseif code_point <= range[2] then return range, mid else low = mid + 1 end end return nil, mid end function get_category(code_point) if category_data.singles[code_point] then return category_data.singles[code_point] else local range = binary_range_search(code_point, category_data.ranges) return range and range[3] or "Cn" end end
函数get_category采用代码点(数字)并返回常规类别的名称.我猜你感兴趣的类别是Nd(数字,十进制数字)和以L(字母)开头的类别.
您将需要一个将字符转换为代码点的函数.如果文件以UTF-8编码并且您使用的是Lua 5.3,则可以使用utf8.codepoint函数:get_category(utf8.codepoint(‘ö’))将导致’Ll’.您可以将类别代码转换为上述函数使用的数字值:函数category_to_number(类别)如果category ==“Nd”则返回1 elseif类别:sub(1,1)==“L”然后返回2否则返回0结束.