2013-09-10 8 views
5

Wörter wie „Annähren“, „überbringen“, „Malmö“ nicht catched vonwie ein lua Muster für Wörter mit Umlauten

for w in string.gmatch(str, "%w+") do 
    print(w) 
end 

Jede Lösung zu schreiben? Vielen Dank!

+0

Können Sie versuchen "% S +". Ich erinnere mich, irgendwo gelesen zu haben, dass% S für jedes Zeichen steht, das NICHT Platz ist. Also: 'für w in string.gmatch (str,"% S + ")' –

+0

Das ist nah an meiner (hoffentlich) endgültigen Lösung: 'für w in string.gmatch (myStr," [^ ,;] + ") tun print (w) Ende Das funktioniert für meine Bedürfnisse. – sunmils

Antwort

0

können Sie versuchen, die folgenden:

local str = "Annähren, Überbringen, Malmö" 
for w in string.gmatch(str, "[%w\128-\244]+") do 
    print(w) 
end 

Es ist nicht ganz korrekt, da es einige UTF-8 Kombinationen ignoriert, aber es kann für Sie arbeiten. This SO answer und dieses post on validating UTF-8 kann nützlich sein.

+1

Ich bin mir nicht sicher, ob das OP mit UTF-8 arbeitet. Es könnte eine erweiterte ASCII-Codierung sein, wodurch der Bereich bis zu 255 erhöht werden könnte (oder die spezifischen Zeichencodes hinzugefügt werden, wenn das OP herausfinden kann, welche sie sind). –

+0

Könnte sein; Ich bin mir auch nicht sicher. Deshalb habe ich gesagt "möge es versuchen";) –

+0

Ja! Deshalb wollte ich diesen Hinweis hinzufügen. :-) –

2

Die Lua String-Bibliothek unterstützt keine andere Zeichenkodierung als ASCII und geht davon aus, dass alle Zeichen 1 Byte sind. Während Lua-Strings 8-Bit-sauber sind, bedeutet dies, dass Funktionen wie string.sub Offsets in Bytes sogar in Multi-Byte-Zeichencodierungen erwarten und Funktionen wie string.match nicht wie erwartet mit Nicht-ASCII-Codierungen verhalten. Es lohnt sich, die wiki page on Unicode in Lua zu lesen, von denen viele auch für andere Nicht-ASCII-Zeichencodierungen gelten.

Für Ihr Problem ist "ö" (z. B. in UTF-8) codiert als die beiden Bytes C3 B6, was bedeutet, dass es nicht von '%w' (das nach Zeichen im az-Bereich sucht) erkannt wird , und hat kein Konzept von Zeichen, die mehrere Bytes umfassen). '[\xc3\xb6]+' wird es übereinstimmen, aber wird auch eine Menge anderer Dinge, nicht alle von denen sind sogar gültig UTF-8 - und mit '[ö]' hat das gleiche Problem, wie Lua wird es als die gleiche Sache interpretieren (eine Sequenz von zwei Bytes eher als ein einzelnes Zeichen). Wenn Sie nicht UTF-8 verwenden, sind die Besonderheiten unterschiedlich, aber das Grundproblem bleibt gleich.

Die Wiki-Seite verknüpft eine Reihe von UTF-8-fähigen Zeichenfolgenbibliotheksimplementierungen für lua, z. B. slnunicode. Andere Codierungen scheinen von der Community nicht weit verbreitet zu sein. Wenn Sie also eine andere Codierung als UTF-8 verwenden, können Sie sie am besten in UTF-8 konvertieren und dann diese oder eine andere Bibliothek verwenden.

+0

In der Praxis sind Sie grundsätzlich richtig. Die Lua-Spezifikation (und der Quellcode) erfordern keinen bestimmten Zeichensatz und keine Codierung. Das Verhalten einiger Funktionen in der 'string'-Bibliothek von Lua hängt von der C-Laufzeitbibliothek (oder dem Äquivalent) ab, für die sie erstellt wurde. Lua-Builder sollten ihren Nutzern technische Daten zu Zeichensätzen, Zahlenmerkmalen usw. zur Verfügung stellen. ** Der Datentyp "String" ist eine gezählte Bytefolge, keine Folge von Zeichen. ** –