2014-07-05 13 views
6

Sono nuovo per andare e sto cercando di implementare una funzione per convertire i caratteri accentati nel loro equivalente non accentato. Sto tentando di seguire l'esempio dato nel blog this (vedi l'intestazione "Performing magic").Vai: Rimozione degli accenti dalle stringhe

Quello che ho cercato di raccogliere da questo è:

package main 

import (
    "fmt" 
    "unicode" 
    "bytes" 
    "code.google.com/p/go.text/transform" 
    "code.google.com/p/go.text/unicode/norm" 
) 


func isMn (r rune) bool { 
     return unicode.Is(unicode.Mn, r) // Mn: nonspacing marks 
    } 

func main() { 
    r := bytes.NewBufferString("Your Śtring") 
    t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC) 
    r = transform.NewReader(r, t) 
    fmt.Println(r) 
} 

Non funziona minimamente e io onestamente non so che cosa significa in ogni caso. Qualche idea?

risposta

3

r deve essere o digitare io.Reader e non è possibile stampare in questo modo. In primo luogo, è necessario leggere il contenuto di una fetta di byte:

var ( 
     s = "Your Śtring" 
     b = make([]byte, len(s)) 

     r io.Reader = strings.NewReader(s) 
) 
t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC) 
r = transform.NewReader(r, t) 
r.Read(b) 
fmt.Println(string(b)) 

Questo funziona, ma per qualche ragione che mi restituisce "Your Stri", due byte meno del necessario.

Questa è la versione che effettivamente fa ciò di cui hai bisogno, ma non sono ancora sicuro del perché l'esempio del blog funzioni così stranamente.

s := "Yoùr Śtring" 
b := make([]byte, len(s)) 

t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC) 
_, _, e := t.Transform(b, []byte(s), true) 
if e != nil { panic(e) } 

fmt.Println(string(b)) 
+0

Nota, sebbene 'transform.NewReader' (o' transform.NewWriter') siano preferiti se esiste un modo per "trasmettere" i dati (ad esempio per trasformare i dati durante la lettura/scrittura da/verso un file o la rete) , se vuoi solo gestire un '[] byte' o' string' esistente, il pacchetto di trasformazione fornisce anche '' transform.Bytes'] (https://godoc.org/golang.org/x/text/transform/# Bytes) e ['transform.String'] (https://godoc.org/golang.org/x/text/transform/#String). –

+0

Chiamare direttamente il metodo di trasformazione come questo non è una buona idea! –

+0

Il motivo per cui ottieni meno byte di quanto ti aspetti è che non stai leggendo tutto dal lettore. La "correzione" più semplice al codice esistente è quella di sostituire la chiamata di lettura con 'io.ReadFull (r, b)', ma ciò fa ancora supposizioni sulla lunghezza finale, ci sono modi migliori per farlo. –

8

noti che Go 1.5 (agosto 2015) o Go 1.6 (Q1 2016) potrebbe introdurre un nuovo rune pacchetto, con le operazioni di trasformazione.

che comprende (in runes/example_test.go) una funzione runes.Remove, che contribuirà a trasformare in résuméresume:

func ExampleRemove() { 
    t := transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC) 
    s, _, _ := transform.String(t, "résumé") 
    fmt.Println(s) 

    // Output: 
    // resume 
} 

Questo è still being reviewed though (April 2015).

Problemi correlati