7

このようなテーブルがあります

table = {57,55,0,15,-25,139,130,-23,173,148,-24,136,158}

PHPのunpack関数でutf8でエンコードされたバイト配列です

unpack('C*',$str);

luaで読み取れるutf-8文字列に変換するにはどうすればよいですか?

4

2 に答える 2

5

Lua は、数値形式の utf-8 バイトのテーブルを utf-8 文字列リテラルに変換するための直接的な関数を提供しません。しかし、次の助けを借りて、このために何かを書くのは簡単ですstring.char:

function utf8_from(t)
  local bytearr = {}
  for _, v in ipairs(t) do
    local utf8byte = v < 0 and (0xff + v + 1) or v
    table.insert(bytearr, string.char(utf8byte))
  end
  return table.concat(bytearr)
end

lua の標準関数や提供されている文字列機能はいずれも utf-8 に対応していないことに注意してください。print上記の関数から返された utf-8 でエンコードされた文字列を取得しようとすると、ファンキーなシンボルが表示されるだけです。より広範な utf-8 サポートが必要な場合は、lua wikiで言及されているライブラリのいくつかを確認してください。

于 2013-09-09T08:59:26.450 に答える
4

RFC 3629 によって制限されている UTF-8 文字セットで機能する包括的なソリューションを次に示します。

do
  local bytemarkers = { {0x7FF,192}, {0xFFFF,224}, {0x1FFFFF,240} }
  function utf8(decimal)
    if decimal<128 then return string.char(decimal) end
    local charbytes = {}
    for bytes,vals in ipairs(bytemarkers) do
      if decimal<=vals[1] then
        for b=bytes+1,2,-1 do
          local mod = decimal%64
          decimal = (decimal-mod)/64
          charbytes[b] = string.char(128+mod)
        end
        charbytes[1] = string.char(vals[2]+decimal)
        break
      end
    end
    return table.concat(charbytes)
  end
end

function utf8frompoints(...)
  local chars,arg={},{...}
  for i,n in ipairs(arg) do chars[i]=utf8(arg[i]) end
  return table.concat(chars)
end

print(utf8frompoints(72, 233, 108, 108, 246, 32, 8364, 8212))
--> Héllö €—
于 2014-09-26T05:18:44.930 に答える