如何在lua中将UTF8字节数组转换为字符串

我有一个像这样的表格

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

这是由 php 的 unpack 函数编码成的 utf8 字节数组

unpack('C*',$str);

我该如何将它转换成我可以在 lua 中阅读的 utf-8 字符串?

点赞
用户234175
用户234175

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。如果你尝试从上述函数返回的 utf-8 编码的字符串进行 print,你只会看到一些奇怪的符号。如果你需要更广泛的 utf-8 支持,你需要查看一些来自 lua wiki 的库。

2013-09-09 08:59:26
用户405017
用户405017

以下是适用于 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-26 05:18:44