3

loadstringによってluaにデータをロードすると、一部の魔法の中国語文字が失敗します。

RawData = '{a="a朶b"}'
Data = loadstring("return " .. RawData)()

それは理由です:

  • "朶"のASCII文字(gbkエンコーディング)は0x960x5cです
  • 0x5cは'\'であり、後ですべてをエスケープします。
  • したがって、'{a="a朶b"}''{a= "a \ 150 \ b"}'になり、\bは間違った答えです

そうすると、正しい出力「a朶b」が得られなくなり、「b」は「朶」に食べられてしまいます…。

同じ引用の問題がPythonで発生します:

exec("""print '''a朶b''' """)

Pythonでこれを処理する方法はいくつかあります。

  • ファイル内のエンコーディングを明確に定義します--coding :gbk ---
  • 文字列/ファイルのエンコーディングにはutf-8を使用します

しかし、luaは標準Cのみをサポートします。引用やエスケープのアイデアはありますか?


ちなみに、これは機能します:

RawData = [=[ {a=[[a朶b]]} ]=]
return  loadstring("return " .. RawData)() .a

しかし、元のRawDataを変更する必要があります。これは受け入れられません。

質問2:

luaの文字列をエスケープしないようにする方法は?(Pythonはこの仕事をとてもうまくやってくれます)

s  = "a朶b"
s1 = string.format("%q", s)    -- s escaped
return s                       -- s escaped
print(s)                       -- s escaped
4

3 に答える 3

3

Luaメーリングリストで説明したように、 Luaは文字列リテラルでUTF-8を適切に処理します。ファイルをUTF-8で保存できれば、Luaで問題は発生しません。後でGBKエンコーディングを使用する必要がある場合(ファイルに保存したり、エンコーディングでWebページを提供したりするなど)、lua-iconvライブラリを使用してUTF-8リテラルからGBKに変換できます。

local iconv = require "iconv"
local toGbk = iconv.new("GBK", "UTF-8")
function U2G(s) return toGbk:iconv(s) end

-- assuming the while file is saved in UTF-8, this will output the string in GBK
print(U2G "a朶b")

を使用する前に、GBKからUTF-8に変換することもできますloadstring。次に、結果をユーザーに提示するときに、UTF-8から変換し直すことを忘れないでください。

于 2012-07-11T11:17:29.367 に答える
0

0x5cの前に「\」を挿入するのはどうですか?

于 2012-07-11T07:39:26.787 に答える
0

まあ、あなたの RawData は不適切にエンコードされているだけであり、それらのどれがマルチバイトまたはスタンドアロンの一部であるかを推測する「ヒューリスティック」を追加する価値はないと思います。シリアライザーを変更する (または開発者に通知する) 必要があるため、Lua が文字列内で特殊として扱うシンボルをシリアライズする前にエスケープする必要があります。この特定のケースでは、文字列がシリアル化に追加される前にすべて\を変換する必要があります。\\

データ ソースが一般的な言語で記述されている場合は、利用可能な Lua シリアライゼーション ライブラリが用意されているかどうかを確認する価値があります。

于 2012-07-11T07:59:58.173 に答える