In UTF-8 codifica il numero di byte adottate per un carattere è determinato dal primo byte di questo personaggio, secondo la tabella seguente (tratto da RFC 3629:
Char. number range | UTF-8 octet sequence
(hexadecimal) | (binary)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Se il bit più alto di il primo byte è "0", quindi il carattere ha un solo byte Se i bit più alti sono "110", il carattere ha 2 byte e così via
Quello che puoi fare è leggere un byte dal file e determinare quanti byte di continuazione è necessario leggere per il carattere UTF-8 completo:
function get_one_utf8_character(file)
local c1 = file:read(1)
if not c1 then return nil end
local ncont
if c1:match("[\000-\127]") then ncont = 0
elseif c1:match("[\192-\223]") then ncont = 1
elseif c1:match("[\224-\239]") then ncont = 2
elseif c1:match("[\240-\247]") then ncont = 3
else
return nil, "invalid leading byte"
end
local bytes = { c1 }
for i=1,ncont do
local ci = file:read(1)
if not (ci and ci:match("[\128-\191]")) then
return nil, "expected continuation byte"
end
bytes[#bytes+1] = ci
end
return table.concat(bytes)
end
Un modo piuttosto semplice ma di sicuro non molto popolare è quello di "analizzare effettivamente i byte (1..6) e convertirli in un valore UTF-32". L'uso di UTF-32 può rendere le cose più facili in alcuni casi, a seconda di cosa farai. – BitTickler
Esegui cosa fa quella funzione mentre legge manualmente un personaggio alla volta? Anche se questo ti finirà per aver letto un altro personaggio di cui avevi bisogno quindi dovrai riavvolgere. –
ho intenzione di creare un correttore di tipografia (che può leggere anche caratteri cechi), quindi leggerò il file di input, troverò gli errori e lo correggerò. Ma è impossibile lavorare con (per i personaggi sconosciuti di Lua). Testo originale: ľúbozvučně řeřicha čučoridka ľaľia Testo che è stato letto da Lua (in Zero Brane Studio): [link] (http://i.imgur.com/PcorbzP.png) quando confronto il primo carattere da entrambi, non corrisponde a – Hrablicky