2011-10-15 7 views

答えて

5

どの程度

function unichr(ord) 
    if ord == nil then return nil end 
    if ord < 32 then return string.format('\\x%02x', ord) end 
    if ord < 126 then return string.char(ord) end 
    if ord < 65539 then return string.format("\\u%04x", ord) end 
    if ord < 1114111 then return string.format("\\u%08x", ord) end 
end 
+0

これは自分の質問にどう答えているのか分かりません。実際には、その前に '\ u'を付けて16進数をフォーマットする方法を尋ねていましたか? –

+0

質問のタイトル - "lucのunicharを表現する方法は何ですか?"実際には、同等のpythonスクリプトと同じものを出力するためにはlua関数が必要でした。明らかに、これだけで十分です。 –

10

これはありません。

ルアにはUnicode値の概念がありません。 LuaにはUnicodeの概念がありませんにはすべてがあります。すべてのLua文字列は "文字"の8ビットシーケンスであり、すべてのLua文字列関数はそれらをそのまま扱います。 Luaは文字列をUnicodeエンコーディングとして扱いません。それらは単なる一連のバイトです。

文字列に任意の数値を挿入できます。例えば:

\表記は255以下でなければならない3桁の数字(またはエスケープ文字のうちの1つ)、続いて
"AB" 

Luaがある:

"\065\066" 

と等価です埋め込まれた文字列を完全に扱うことができます。\000文字。

しかし、UnicodeコードポイントをLua文字列に直接挿入することはできません。コードポイントをUTF-8に分解し、上記のメカニズムを使用してコードポイントを文字列に挿入することができます。たとえば:

"x\226\131\151" 

これはUnicode combining above arrow character続いx文字です。

しかし、Lua関数は実際にUTF-8を理解していないので、UTF-8文字列を期待する関数を公開する必要があります。

3

ネイティブLuaはUnicodeを直接サポートまたは処理しませんが、その文字列は実際にはASCII文字を保持する任意のバイトのバッファです。文字列には任意のバイト値が含まれる可能性があるため、ネイティブ文字列の上にUnicodeのサポートを構築するのは比較的簡単です。バイトバッファの目的が不十分であることが判明した場合は、userdataオブジェクトを使用してオブジェクトを保持し、適切なメタテーブルを追加して、作成方法、目的のエンコーディングへの変換、連結、反復、および必要なものは他にあります。

LuaプログラムでUnicodeを処理するさまざまな方法について説明しているa page at the Lua User's Wikiがあります。より近代的な答えを

2

、Luaの5.3は今utf8.charがあります

はゼロ以上の整数を受け取り、それに対応するUTF-8バイトシーケンスにそれぞれ1を変換し、これらすべてのシーケンスを連結した文字列を返します。

関連する問題