2013-09-10 2 views
5

Parole come "Annähren", "Überbringen", "Malmö" non vengono pescati daCome scrivere un modello di lua per le parole con dieresi

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

Qualsiasi soluzione? Grazie!

+0

Puoi provare "% S +". Ricordo di aver letto da qualche parte che% S rappresenta ogni carattere che NON è spazio. Quindi: 'per w in string.gmatch (str,"% S + ")' –

+0

Questo è vicino alla mia soluzione finale (si spera): 'per w in string.gmatch (myStr," [^ ,;] + ") do print (w) end' Questo funziona per i miei bisogni. – sunmils

risposta

0

si può provare il seguente:

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

Non è strettamente corretto in quanto ignora alcune combinazioni UTF-8, ma può funzionare per voi. This SO answer e questo post on validating UTF-8 potrebbe essere utile.

+1

Non sono sicuro che l'OP funzioni con UTF-8. Potrebbe essere una codifica ASCII estesa, quindi estendere l'intervallo fino a '\ 255' potrebbe essere necessario (o aggiungere i codici char specifici, se l'OP può scoprire quali sono). –

+0

Potrebbe essere; Non sono nemmeno sicuro. Ecco perché ho detto "potrebbe provare";) –

+0

Sì! Ecco perché mi sentivo di aggiungere quel suggerimento. :-) –

2

La libreria di stringhe Lua non supporta intrinsecamente alcuna codifica di caratteri diversa da ASCII e presuppone che tutti i caratteri siano 1 byte. Sebbene le stringhe lua siano pulite a 8 bit, ciò significa che funzioni come string.sub prevedono offset in byte anche in codifiche di caratteri multibyte e funzioni come string.match non si comportano come previsto con codifiche non ASCII. Vale la pena leggere lo wiki page on Unicode in Lua, molti dei quali si applica anche ad altre codifiche di caratteri non ASCII.

Per il tuo problema in particolare, "ö" è (in, per esempio, UTF-8) codificato come i due byte C3 B6, il che significa che non verrà riconosciuto da '%w' (che cerca i caratteri nell'intervallo az e non ha concetto di caratteri che abbracciano più byte). '[\xc3\xb6]+' lo abbinerà, ma corrisponderà anche a molte altre cose, non tutte uguali a UTF-8 e usando lo '[ö]' ha lo stesso problema, dato che lua lo interpreterà come la stessa cosa (una sequenza di due byte piuttosto di un singolo personaggio). Se non si utilizza UTF-8, le specifiche sono diverse, ma il problema di base rimane lo stesso.

La pagina wiki collega un numero di implementazioni di libreria di stringhe compatibili UTF-8 per lua, come ad esempio slnunicode. Altre codifiche non sembrano essere ampiamente utilizzate dalla comunità, quindi se stai usando una codifica diversa da UTF-8, la tua scommessa migliore può essere convertita in UTF-8 e quindi usare quella libreria o un'altra simile.

+0

In pratica, sei sostanzialmente corretto. Le specifiche Lua (e il codice sorgente) non richiedono alcun set di caratteri e codifiche particolari. Il comportamento di alcune funzioni nella libreria 'stringa' di Lua dipende dalla libreria di runtime C (o equiv) per la quale è stata costruita. I costruttori Lua dovrebbero fornire ai propri utenti dati tecnici su set di caratteri, caratteristiche numeriche, ecc. ** Il tipo di dati 'string' è una sequenza contata di byte, non una sequenza di caratteri. ** –