local char = "A"
-- Code of the char
local int_value = char:byte()
-- int_value = 65
local char_b = string.char(int_value + 1)
-- char_b = B
-- byte takes a range: a code for each char
local codes = {string.byte("ABC", 1, -1)}
-- codes = 65, 66, 67
-- The codes make one string back
-- (a short list: unpack has a limit)
local word = string.char(table.unpack(codes))
-- word = ABC
-- Beyond ASCII: byte gives a byte of the char,
-- utf8.codepoint gives the code point
local euro = "\u{20AC}"
local euro_byte = euro:byte()
-- euro_byte = 226
local euro_value = utf8.codepoint(euro)
-- euro_value = 8364
local same_euro = utf8.char(euro_value) == euro
-- same_euro = true
print("int_value = " .. int_value)
print("char_b = " .. char_b)
print("codes = " .. table.concat(codes, ", "))
print("word = " .. word)
print("euro_byte = " .. euro_byte)
print("euro_value = " .. euro_value)
print("same_euro = " .. tostring(same_euro))
-- string.char takes a byte, not a code point
local ok, err = pcall(string.char, euro_value)
-- ok = false
-- err = bad argument #1 to 'string.char'
-- (value out of range)
print("ok = " .. tostring(ok))
print("err = " .. err)