#!/usr/bin/env luajit local bit = require 'bit' local function code_to_utf8(code) if code <= 0x7f then return string.char(code) elseif code <= 0x7ff then return string.char( bit.bor(0xC0, bit.rshift(code, 6)), bit.bor(0x80, bit.band(code, 0x3f)) ) elseif code <= 0xffff then return string.char( bit.bor(0xE0, bit.rshift(code, 12)), bit.bor(0x80, bit.band(bit.rshift(code, 6), 0x3f)), bit.bor(0x80, bit.band(code, 0x3f)) ) elseif code <= 0x10FFFF then return string.char( bit.bor(0xE0, bit.rshift(code, 18)), bit.bor(0x80, bit.band(bit.rshift(code, 12), 0x3f)), bit.bor(0x80, bit.band(bit.rshift(code, 06), 0x3f)), bit.bor(0x80, bit.band(code, 0x3f)) ) else error 'Invalid character!' end end for line in io.stdin:lines() do local code = tonumber(line:match('%x+'), 16) print(line, code_to_utf8(code)) end