2011-11-02 11 views
6

¿Cómo puedo escribir un símbolo Unicode en lua? Por ejemplo tengo que escribir el símbolo con el 9658
cuando escriboCómo escribir un símbolo Unicode en lua

string.char(9658); 

me dio un error. Entonces, ¿cómo es posible escribir un símbolo?

+1

Sería de gran ayuda saber qué codificación que desea la cadena resultante en – MattJ

Respuesta

12

Lua no se ve cuerdas dentro. Por lo tanto, sólo puede escribir

mychar = "►" 

(añadido en 2015)

Lua 5.3 incluía compatibilidad con UTF-8 secuencias de escape:

La codificación UTF-8 de un carácter Unicode puede haber insertado en una cadena literal con la secuencia de escape \ u {XXX} (tenga en cuenta los corchetes de inclusión obligatorios), donde XXX es una secuencia de uno o más dígitos hexadecimales que representan el punto de código de carácter.

También puede usar utf8.char(9658).

+2

Tenga en cuenta que esto solo funcionaría si el archivo está codificado en UTF-8. Por supuesto, no se puede empujar la secuencia de comandos de Lua al intérprete a menos que sea ASCII o UTF-8. –

2

Tal vez esto le puede ayudar:

function FromUTF8(pos) 
    local mod = math.mod 
    local function charat(p) 
    local v = editor.CharAt[p]; if v < 0 then v = v + 256 end; return v 
    end 
    local v, c, n = 0, charat(pos), 1 
    if c < 128 then v = c 
    elseif c < 192 then 
    error("Byte values between 0x80 to 0xBF cannot start a multibyte sequence") 
    elseif c < 224 then v = mod(c, 32); n = 2 
    elseif c < 240 then v = mod(c, 16); n = 3 
    elseif c < 248 then v = mod(c, 8); n = 4 
    elseif c < 252 then v = mod(c, 4); n = 5 
    elseif c < 254 then v = mod(c, 2); n = 6 
    else 
    error("Byte values between 0xFE and OxFF cannot start a multibyte sequence") 
    end 
    for i = 2, n do 
    pos = pos + 1; c = charat(pos) 
    if c < 128 or c > 191 then 
     error("Following bytes must have values between 0x80 and 0xBF") 
    end 
    v = v * 64 + mod(c, 64) 
    end 
    return v, pos, n 
end 
+2

I Estoy bastante seguro de que la función es lo opuesto a lo que él quiere. Tiene un punto de código Unicode que quiere codificar en UTF-8. –

+0

¡Opuesto puede recorrer un largo camino, también! :) –

2

Para obtener un soporte más amplio para el contenido de cadenas Unicode, un enfoque es slnunicode que se desarrolló como parte de la biblioteca de bases de datos Selene. Le dará un módulo que es compatible con la mayoría de lo que hace la biblioteca estándar string, pero con caracteres Unicode y codificación UTF-8.

3

Aquí es un codificador para Lua que tiene un punto de código Unicode y produce una cadena UTF-8 para el carácter correspondiente:.

do 
    local bytemarkers = { {0x7FF,192}, {0xFFFF,224}, {0x1FFFFF,240} } 
    function utf8(decimal) 
    if decimal<128 then return string.char(decimal) end 
    local charbytes = {} 
    for bytes,vals in ipairs(bytemarkers) do 
     if decimal<=vals[1] then 
     for b=bytes+1,2,-1 do 
      local mod = decimal%64 
      decimal = (decimal-mod)/64 
      charbytes[b] = string.char(128+mod) 
     end 
     charbytes[1] = string.char(vals[2]+decimal) 
     break 
     end 
    end 
    return table.concat(charbytes) 
    end 
end 

c=utf8(0x24) print(c.." is "..#c.." bytes.") --> $ is 1 bytes. 
c=utf8(0xA2) print(c.." is "..#c.." bytes.") --> ¢ is 2 bytes. 
c=utf8(0x20AC) print(c.." is "..#c.." bytes.") --> € is 3 bytes. 
c=utf8(0x24B62) print(c.." is "..#c.." bytes.") --> is 4 bytes. 
Cuestiones relacionadas