2011-11-02 20 views
6

Come posso scrivere un simbolo Unicode in lua. Per esempio devo scrivere simbolo con 9658
quando scrivoCome scrivere un simbolo Unicode in lua

string.char(9658); 

ho ottenuto un errore. Quindi, come è possibile scrivere un tale simbolo.

+1

Sarebbe utile sapere che cosa la codifica si desidera che la stringa risultante in – MattJ

risposta

12

Lua non sembra stringhe all'interno. Così, si può semplicemente scrivere

mychar = "►" 

(aggiunto nel 2015)

Lua 5.3 ha introdotto il supporto per UTF-8 sequenze di escape:

La codifica UTF-8 di un carattere Unicode può essere inserito in una stringa letterale con la sequenza di escape \ u {XXX} (notare le parentesi graffe obbligatorie), dove XXX è una sequenza di una o più cifre esadecimali che rappresentano il punto di codice del carattere.

È inoltre possibile utilizzare utf8.char(9658).

+2

Si noti che ciò funzionerebbe solo se il file stesso è codificato in UTF-8. Ovviamente, non è possibile inserire lo script Lua nell'interprete a meno che non sia ASCII o UTF-8. –

2

Forse questo può aiutare:

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 Sono abbastanza sicuro che quella funzione sia l'opposto di ciò che vuole. Ha un codice Unicode che desidera codificare in UTF-8. –

+0

Anche l'opposto può fare molto! :) –

2

Per ottenere un supporto più ampio per il contenuto di stringhe Unicode, un approccio è slnunicode che è stato sviluppato come parte della libreria del database Selene. Vi fornirà un modulo che supporta la maggior parte di ciò che fa la libreria standard string, ma con caratteri Unicode e codifica UTF-8.

3

Ecco un encoder per Lua che prende un punto di codice Unicode e produce una stringa UTF-8 per il personaggio corrispondente:.

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. 
Problemi correlati