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!

15. Februar 2010 von Patrick Gundlach
Kategorien: LuaTeX | Schlagwörter: , | Schreibe einen Kommentar

Schreibe einen Kommentar