Luaでマルチバイト文字を使う場合の対応方法
Lua5.3以降では、標準ライブラリにUTF-8文字列を扱うための「utf8ライブラリ」が含まれているので、以下のようにすることで対応できる。 string.subに対応する関数がutf8ライブラリにはないため、utf8_subとして定義している。
code:Lua
local function utf8_sub(str, startChar, endChar)
local startByte = utf8.offset(str, startChar)
local endByte = utf8.offset(str, endChar + 1) and utf8.offset(str, endChar + 1) - 1 or #str if startByte and endByte then
return string.sub(str, startByte, endByte)
else
return ""
end
end
-- 使用例
local moji = "日本語の文字列"
local nagasa = utf8.len(moji)
for i = 1, nagasa do
print(utf8_sub(moji, 1, i))
end
code:実行結果
日
日本
日本語
日本語の
日本語の文
日本語の文字
日本語の文字列
※1バイト文字(半角英数字など)が混在していても正常に動作する。