--æªåä¸è±æ··åçUTF8å符串ï¼endIndexå¯ç¼ºç function SubStringUTF8(str, startIndex, endIndex) if startIndex < 0 then startIndex = SubStringGetTotalIndex(str) + startIndex + 1; end if endIndex ~= nil and endIndex < 0 then endIndex = SubStringGetTotalIndex(str) + endIndex + 1; end if endIndex == nil then return string.sub(str, SubStringGetTrueIndex(str, startIndex)); else return string.sub(str, SubStringGetTrueIndex(str, startIndex), SubStringGetTrueIndex(str, endIndex + 1) - 1); end end --è·åä¸è±æ··åUTF8å符串ççå®å符æ°é function SubStringGetTotalIndex(str) local curIndex = 0; local i = 1; local lastCount = 1; repeat lastCount = SubStringGetByteCount(str, i) i = i + lastCount; curIndex = curIndex + 1; until(lastCount == 0); return curIndex - 1; end function SubStringGetTrueIndex(str, index) local curIndex = 0; local i = 1; local lastCount = 1; repeat lastCount = SubStringGetByteCount(str, i) i = i + lastCount; curIndex = curIndex + 1; until(curIndex >= index); return i - lastCount; end --è¿åå½åå符å®é å ç¨çåç¬¦æ° function SubStringGetByteCount(str, index) local curByte = string.byte(str, index) local byteCount = 1; if curByte == nil then byteCount = 0 elseif curByte > 0 and curByte <= 127 then byteCount = 1 elseif curByte>=192 and curByte<=223 then byteCount = 2 elseif curByte>=224 and curByte<=239 then byteCount = 3 elseif curByte>=240 and curByte<=247 then byteCount = 4 end return byteCount; end