utf 8 - Cómo convertir matrices de bytes UTF8 a string en lua
utf-8 bytearray (2)
Lua no proporciona una función directa para convertir una tabla de bytes utf-8 en forma numérica en un literal de cadena utf-8. Pero es bastante fácil escribir algo para esto con la ayuda de 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
Tenga en cuenta que ninguna de las funciones estándar de lua ni las facilidades de cadenas provistas son conscientes de utf-8. Si intenta print
cadena codificada en utf-8 devuelta por la función anterior, verá algunos símbolos funky. Si necesita una mayor compatibilidad con utf-8, querrá consultar algunas de las bibliotecas mencionadas en la wiki de lua .
Tengo una mesa como esta
table = {57,55,0,15,-25,139,130,-23,173,148,-24,136,158}
es utf8 byte array codificado por la función php unpack
unpack(''C*'',$str);
¿Cómo puedo convertirlo en una cuerda utf-8 que puedo leer en lua?
Aquí hay una solución completa que funciona para el conjunto de caracteres UTF-8 restringido por RFC 3629:
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ö €—