Suport Unicode și Șiruri UTF-8 în Lua: Biblioteca Standard utf8 în Lua

Manipulare Text Lua 5.4

Ghid complet pentru manipularea textelor Unicode în Lua 5.4: utilizarea bibliotecii standard utf8, numărarea caracterelor cu utf8.len, iterarea codepoint-urilor cu utf8.codes și validarea șirurilor.

Sintaxă
utf8.len(str); for p, c in utf8.codes(str) do ... end; utf8.char(codepoint)

Î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.