local StringHelper = {}
--[[
utf-8編碼規則
單位元組 - 0起頭
1位元組 0xxxxxxx 0 - 127
多位元組 - 第一個位元組n個1加1個0起頭
2 位元組 110xxxxx 192 - 223
3 位元組 1110xxxx 224 - 239
4 位元組 11110xxx 240 - 247
可能有1-4個位元組
--]]
function StringHelper.GetBytes(char)
if not char then
return 0
end
local code = string.byte(char)
if code < 127 then
return 1
elseif code <= 223 then
return 2
elseif code <= 239 then
return 3
elseif code <= 247 then
return 4
else
-- 講道理不會走到這裡^_^
function StringHelper.Sub(str, startIndex, endIndex)
local tempStr = str
local byteStart = 1 -- string.sub擷取的開始位置
local byteEnd = -1 -- string.sub擷取的結束位置
local index = 0 -- 字元記數
local bytes = 0 -- 字元的位元組記數
startIndex = math.max(startIndex, 1)
endIndex = endIndex or -1
while string.len(tempStr) > 0 do
if index == startIndex - 1 then
byteStart = bytes+1;
elseif index == endIndex then
byteEnd = bytes;
break;
bytes = bytes + StringHelper.GetBytes(tempStr)
tempStr = string.sub(str, bytes+1)
index = index + 1
return string.sub(str, byteStart, byteEnd)
local StringHelper = {}
--[[
utf-8編碼規則
單位元組 - 0起頭
1位元組 0xxxxxxx 0 - 127
多位元組 - 第一個位元組n個1加1個0起頭
2 位元組 110xxxxx 192 - 223
3 位元組 1110xxxx 224 - 239
4 位元組 11110xxx 240 - 247
可能有1-4個位元組
--]]
function StringHelper.GetBytes(char)
if not char then
return 0
end
local code = string.byte(char)
if code < 127 then
return 1
elseif code <= 223 then
return 2
elseif code <= 239 then
return 3
elseif code <= 247 then
return 4
else
-- 講道理不會走到這裡^_^
return 0
end
end
function StringHelper.Sub(str, startIndex, endIndex)
local tempStr = str
local byteStart = 1 -- string.sub擷取的開始位置
local byteEnd = -1 -- string.sub擷取的結束位置
local index = 0 -- 字元記數
local bytes = 0 -- 字元的位元組記數
startIndex = math.max(startIndex, 1)
endIndex = endIndex or -1
while string.len(tempStr) > 0 do
if index == startIndex - 1 then
byteStart = bytes+1;
elseif index == endIndex then
byteEnd = bytes;
break;
end
bytes = bytes + StringHelper.GetBytes(tempStr)
tempStr = string.sub(str, bytes+1)
index = index + 1
end
return string.sub(str, byteStart, byteEnd)
end