From ee77614b9704ca21a1961da3cdae92ef6980a983 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Thu, 16 Aug 2018 13:10:06 -0400 Subject: [PATCH] treat strings prefixed with 0xff as Lua's weird UTF-8 encoding translate them to bare ISO-8859-1 at print time Only alters chars with codes > 0x9f, so graphics/symbols in the 0x7f-0x9f range and color and control codes < 0x20 are preserved The routine assumes that any char code > 0x9f is the first byte of a two-byte UTF-8 symbol. Note that due to Minetest's busted formspecs, it's not possible to actually type-in or copy-paste proper UTF strings to take advantage of this mode, so it's only useful if the strings are generated by or imported in from something else (e.g. a URL or something, or a LuaC program that generates strings) --- init.lua | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/init.lua b/init.lua index c8a2d2f..6fb4d11 100644 --- a/init.lua +++ b/init.lua @@ -24,6 +24,35 @@ local on_digiline_receive_std = function(pos, node, channel, msg) end end +-- convert Lua's idea of a UTF-8 char to ISO-8859-1 + +-- first char is non-break space, 0xA0 +iso_chars=" ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" + +get_iso = function(c) + local hb = string.byte(c,1) or 0 + local lb = string.byte(c,2) or 0 + local dec = lb+hb*256 + local char = dec - 49664 + if dec > 49855 then char = dec - 49856 end + return char +end + +make_iso = function(s) + local i = 1 + local s2 = "" + while i <= string.len(s) do + if string.byte(s,i) > 159 then + s2 = s2..string.char(get_iso(string.sub(s, i, i+1))) + i = i + 2 + else + s2 = s2..string.sub(s, i, i) + i = i + 1 + end + end + return s2 +end + -- the nodes: local fdir_to_right = { @@ -43,12 +72,15 @@ local cbox = { } local display_string = function(pos, channel, string) + string = string.sub(string, 1, 1024) if string == "off_multi" then string = string.rep(" ", 1024) elseif string == "allon_multi" then string = string.rep(string.char(144), 1024) + elseif string.sub(string,1,1) == string.char(255) then -- treat it as incoming UTF-8 + string = make_iso(string.sub(string, 2, 1024)) end - string = string.sub(string, 1, 1024) + local master_fdir = minetest.get_node(pos).param2 % 8 local master_meta = minetest.get_meta(pos) local last_color = master_meta:get_int("last_color")