selene unicode Bibliothek
Auf der LuaTeX Mailingliste wurde gefragt, welche Funktionalität die in LuaTeX eingebundene Bibliothek selunicode hat. Die Bibliothek bietet einige Ersatzfunktionen für die eingebaute string
-Bibliothek. Speziell handelt es sich um:
byte(str, start [,end=-1])
char(i [,j...])
len(str)
lower(str)
reverse(str)
sub(str, start [,end=-1])
upper(str)
sowie veränderte Zeichenklassen für
find
match
gmatch
gsub
Ein kleines Beispiel soll zeigen, warum die spezielle Handhabung von UTF-8 Strings notwendig ist:
print(string.format("string-len=%d, unicode.utf8-len=%d", string.len("Löss"), unicode.utf8.len("Löss")))
ergibt
string-len=5, unicode.utf8-len=4
Und das Ergebnis 4 hätte ich auch erwartet. Der Hintergrund ist der, dass das ö als zwei Zeichen in UTF-8 kodiert ist, und zwar als 195 und 182 (0xC3B6). Da die original Lua-String-Funktionen nicht mit UTF-8 umgehen können, sehen sie dieses zusammengesetzte Zeichen als einzelne Zeichen. Dadurch ergibt sich die höhere Ausgabe der string.len()
-Funktion.
Die Zeichenklassen für find
, match
, gmatch
und gsub
sind folgende:
%a L* (Lu+Ll+Lt+Lm+Lo) %c Cc %d 0-9 %l Ll %n N* (Nd+Nl+No, neu) %p P* (Pc+Pd+Ps+Pe+Pi+Pf+Po) %s Z* (Zs+Zl+Zp) und die Controllzeichen 9-13 (HT,LF,VT,FF,CR) %u Lu (und Lt ?) %w %a+%n+Pc (z.B. '_') %x 0-9A-Za-z %z das Null-byte (\0)
Die Erklärung der Symbole Nd, Nl, No, … findest du unter http://www.unicode.org/Public/4.0-Update1/UCD-4.0.1.html#General_Category_Values.
Hier noch ein Beispiel für die Verwendung der Zeichenklassen:
local str = "...Α-Ω..." print(string.find(str,"%u")) -- nil print(unicode.utf8.find(str,"%u")) -- 4 5 print(string.match(str,"%u")) -- nil print(unicode.utf8.match(str,"%u")) -- A for w in string.gmatch(str, "%u") do -- keine Treffer -- (wird nicht erreicht) end for w in unicode.utf8.gmatch(str, "%u") do print(w) -- Α Ω end
Vielen Dank an den Fragesteller für die ergänzenden Hinweise zu den Zeichenklassen!