În mod istoric, șirurile din Lua sunt simple secvențe de octeți (8-bit clean). Odată cu Lua 5.3 și 5.4, a fost introdusă biblioteca standard utf8, care oferă suport nativ pentru citirea, validarea și parcurgerea textelor codificate UTF-8 fără dependențe externe.
Diferența dintre lungimea în octeți (#) și lungimea UTF-8 (utf8.len)
local textRomana = "Programare în Lua: învățăm eficient!"
-- Operatorul '#' returnează numărul de OCTEȚI (caracterele cu diacritice ocupă 2 octeți):
print("Număr de octeți (#):", #textRomana) -- de exemplu: 40 octeți
-- utf8.len() calculează numărul REAL de caractere (codepoints):
local nrCaractere, pozEroare = utf8.len(textRomana)
if nrCaractere then
print("Număr real de caractere (UTF-8):", nrCaractere) -- 36 caractere
else
print("Șirul conține secvențe UTF-8 invalide la poziția de octet:", pozEroare)
end
Iterarea caracterelor și conversia codepoint-urilor
local salutEmoji = "Salut 👋 Lume 🌍"
-- Parcurgerea caracterelor Unicode cu utf8.codes:
print("--- Iterare caractere Unicode ---")
for offsetOctet, codepoint in utf8.codes(salutEmoji) do
local caracter = utf8.char(codepoint)
print(string.format("Offset: %2d | Codepoint: U+%04X | Caracter: %s",
offsetOctet, codepoint, caracter))
end
-- Generarea caracterelor din coduri numerice Unicode:
local inima = utf8.char(0x2764)
local sageata = utf8.char(0x2192)
print("Simboluri:", sageata, inima)
| Funcție | Semnătură | Descriere |
|---|---|---|
utf8.len(s, [i, [j]]) |
(string, [int, int]) |
Returnează numărul de caractere UTF-8 sau false, poz dacă găsește un octet invalid. |
utf8.codes(s) |
(string) |
Iterator pentru bucla for, furnizând perechile (offset_octet, codepoint). |
utf8.char(...) |
(integers) |
Convertește zero sau mai multe codepoint-uri numerice într-un șir UTF-8. |
utf8.codepoint(s, [i, [j]]) |
(string, [int, int]) |
Returnează codurile numerice ale caracterelor de la pozițiile de octet specificate. |