hi Rob, thanks for the tip.
my first thinking was exactly utf8 problem, so i used this old code, not made by me, to try if that was the problem:
-- -- Converts all unicode characters (\>127) into UTF-8 character sets --@param unicode ASCII or unicoded string --@return a UTF-8 representation function utf8\_encode(unicode) local math = math local utf8 = "" for i=1,string.len(unicode) do local v = string.byte(unicode,i) local n, s, b = 1, "", 0 if v \>= 67108864 then n = 6; b = 252 elseif v \>= 2097152 then n = 5; b = 248 elseif v \>= 65536 then n = 4; b = 240 elseif v \>= 2048 then n = 3; b = 224 elseif v \>= 128 then n = 2; b = 192 end for i = 2, n do local c = math.mod(v, 64); v = math.floor(v / 64) s = string.char(c + 128)..s end s = string.char(v + b)..s utf8 = utf8..s end return utf8 end
with no success. i saw the corona plugin but i need to confess i didn’t try it. I thought was the same approach and i remember seeing this working without any plugin.
Saying this, i installed the plugin like you suggested and worked like a charm. So for now my problem is solved, thanks 
but my question still remains, string.upper() should work. I read this from the lua manual:
Both string.upper and string.lower follow the current locale. Therefore, if you work with the European Latin-1 locale, the expression string.upper(“ação”)
results in “AÇÃO”.
i used system.getPreference to check my locale country/language and was correct (pt). so the problem seems that corona is not using locale correctly with string.upper.