8

LuaでUTF-8でエンコードされた文字列の最初の文字を抽出する方法はありますか?

LuaはUnicodeを適切にサポートしていないため、ではなくstring.sub("ÆØÅ", 2, 2)戻ります。"?""Ø"

文字列の最初の文字(漢字またはA)を取得することのみを目的として、バイトごとの文字列に対して使用できる比較的単純なUTF-8解析アルゴリズムはありますか?

または、この方法は複雑すぎて、巨大なライブラリなどが必要ですか?

4

2 に答える 2

18

次のコードを使用すると、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 コード ポイントの数値ではなく、各文字の文字列値を返すことに注意してください。

于 2012-11-05T18:39:04.840 に答える
3

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]*"

于 2015-01-14T11:12:53.190 に答える