darkrc/bin/cp2utf8

35 lines
910 B
Plaintext
Executable File

#!/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