LuaでUTF-8でエンコードされた文字列の最初の文字を抽出する方法はありますか?
LuaはUnicodeを適切にサポートしていないため、ではなくstring.sub("ÆØÅ", 2, 2)
戻ります。"?"
"Ø"
文字列の最初の文字(漢字またはA)を取得することのみを目的として、バイトごとの文字列に対して使用できる比較的単純なUTF-8解析アルゴリズムはありますか?
または、この方法は複雑すぎて、巨大なライブラリなどが必要ですか?
次のコードを使用すると、UTF-8 でエンコードされた文字列から最初の文字を簡単に抽出できます。
function firstLetter(str)
return str:match("[%z\1-\127\194-\244][\128-\191]*")
end
UTF-8 コード ポイントは、0 ~ 127 のバイトで始まるか、194 ~ 244 のバイトの後に 128 ~ 191 の 1 つまたは複数のバイトが続くためです。
同様の方法で UTF-8 コード ポイントを反復処理することもできます。
for code in str:gmatch("[%z\1-\127\194-\244][\128-\191]*") do
print(code)
end
どちらの例も、Unicode コード ポイントの数値ではなく、各文字の文字列値を返すことに注意してください。
Lua 5.3 はUTF-8 ライブラリを提供します。
を使用utf8.codes
して各コード ポイントを取得し、次に を使用utf8.char
して文字を取得できます。
local str = "ÆØÅ"
for _, c in utf8.codes(str) do
print(utf8.char(c))
end
これも機能します:
local str = "ÆØÅ"
for w in str:gmatch(utf8.charpattern ) do
print(w)
end
whereは、 1 つの UTF-8 バイト シーケンスに一致するパターンのutf8.charpattern
単なる文字列です。"[\0-\x7F\xC2-\xF4][\x80-\xBF]*"