Lua中获取utf8字符串长度的方法和自定义函数
---获取utf8编码字符串正确长度的方法
--@paramstr
--@returnnumber
functionutfstrlen(str)
locallen=#str;
localleft=len;
localcnt=0;
localarr={0,0xc0,0xe0,0xf0,0xf8,0xfc};
whileleft~=0do
localtmp=string.byte(str,-left);
locali=#arr;
whilearr[i]do
iftmp>=arr[i]thenleft=left-i;break;end
i=i-1;
end
cnt=cnt+1;
end
returncnt;
end
lua的string库不支持处理utf-8编码的汉字。用lua要处理汉字还是很费劲的。
UTF8的编码规则:
1.字符的第一个字节范围:0x00—0x7F(0-127),或者0xC2—0xF4(194-244);UTF8是兼容ascii的,所以0~127就和ascii完全一致
2.0xC0,0xC1,0xF5—0xFF(192,193和245-255)不会出现在UTF8编码中
3.0x80—0xBF(128-191)只会出现在第二个及随后的编码中(针对多字节编码,如汉字)
这样我们可以利用lua强大的模式匹配,来实现我们要的效果,关键的处理有这么两个:
1.local_,count=string.gsub(str,"[^\128-\193]",""),用来得到str中的字符数
2.forucharinstring.gfind(str,"[%z\1-\127\194-\244][\128-\191]*")dotab[#tab+1]=ucharend,用来把str中的每个字符映射到tab中