#!/usr/bin/env lua -- convert numeric html entities to utf8 -- converts from stdin to stdout -- example: € -> € local char = string.char local function tail(n, k) local u, r='' for i=1,k do n,r = math.floor(n/0x40), n%0x40 u = char(r+0x80) .. u end return u, n end local function to_utf8(a) local n, r, u = tonumber(a) if n<0x80 then -- 1 byte return char(n) elseif n<0x800 then -- 2 byte u, n = tail(n, 1) return char(n+0xc0) .. u elseif n<0x10000 then -- 3 byte u, n = tail(n, 2) return char(n+0xe0) .. u elseif n<0x200000 then -- 4 byte u, n = tail(n, 3) return char(n+0xf0) .. u elseif n<0x4000000 then -- 5 byte u, n = tail(n, 4) return char(n+0xf8) .. u else -- 6 byte u, n = tail(n, 5) return char(n+0xfc) .. u end end for line in io.lines() do out = string.gsub(line, '&#(%d+);', to_utf8) print(out) end