8

スロバキア語の単語の文字列から文字を抽出しようとしています。たとえば、「TURTLE」の単語は「KORYTNAČKA」です。ただし、文字列から抽出しようとすると、「Č」文字がスキップされます。

local str = "KORYTNAČKA"
for c in str:gmatch("%a") do print(c) end
--result: K,O,R,Y,T,N,A,K,A

私はこのページを読んでいて、文字列自体をセットとして貼り付けようとしましたが、何か変なものが出てきました:

local str = "KORYTNAČKA"
for c in str:gmatch("["..str.."]") do print(c) end
--result: K,O,R,Y,T,N,A,Ä,Œ,K,A

誰でもこれを解決する方法を知っていますか?

4

4 に答える 4

5

Lua は 8 ビット クリーンです。つまり、Lua 文字列はすべての文字が 1 バイトであると想定されます。パターン"%a"は 1 バイト文字に一致するため、結果は期待したものではありません。

このパターン"["..str.."]"が機能するのは、Unicode 文字に複数のバイトが含まれている可能性があるためです。このパターンでは、これらのバイトをセットで使用して、文字と一致させることができます。


UTF-8 が使用されている場合、パターン"[\0-\x7F\xC2-\xF4][\x80-\xBF]*"を使用して、次のように Lua 5.2 の単一の UTF-8 バイト シーケンスに一致させることができます。

local str = "KORYTNAČKA"
for c in str:gmatch("[\0-\x7F\xC2-\xF4][\x80-\xBF]*") do 
    print(c) 
end

Lua 5.1 (Corona SDK が使用しているバージョン) では、これを使用します。

local str = "KORYTNAČKA"
for c in str:gmatch("[%z\1-\127\194-\244][\128-\191]*") do 
    print(c) 
end

このパターンの詳細については、Lua 5.1 の「[\0-\x7F\xC2-\xF4][\x80-\xBF]*」と同等のパターンを参照してください。

于 2014-04-09T06:11:52.497 に答える
1

Lua には、Unicode 文字列の組み込み処理がありません。Ä,Œ文字の UTF-8 エンコードを表す 2 バイトであることがわかりますČ

Yu Hao は既にサンプル ソリューションを提供していますが、詳細については、ここに良いソースがあります。

このソリューションが Lua 5.1 で適切に機能することをテストしたところ、リンクが予約されています。utf8sub関数を使用して個々の文字を抽出できます。サンプルを参照してください。

于 2014-04-09T06:16:34.570 に答える
0
string.gmatch(str, "[%z\1-\127\192-\253][\128-\191]*")
于 2018-07-13T09:34:38.790 に答える