2013-10-17 9 views
10

Ho problemi durante la lettura di un file che ha un formato di lunghezza di colonna fissa. Alcune colonne potrebbero contenere dieresi.Umlauts e slice

I dieresi sembrano utilizzare 2 byte invece di uno. Questo non è il comportamento che mi aspettavo. Esiste qualche tipo di funzione che restituisce una sottostringa? Slice non sembra funzionare in questo caso.

Ecco alcuni esempi di codice:

http://play.golang.org/p/ZJ1axy7UXe

umlautsString := "Rhön" 
fmt.Println(len(umlautsString)) 
fmt.Println(umlautsString[0:4]) 

Stampe:

5 
Rhö 

risposta

12

in Go, una fetta di una stringa conta byte, non runes. Questo è il motivo per cui "Rhön"[0:3] fornisce Rh e il primo byte di ö.

I caratteri codificati in UTF-8 sono rappresentati come rune in quanto UTF-8 codifica i caratteri in più di un byte (fino a quattro byte) per fornire un intervallo più ampio di caratteri.

Se si desidera tagliare una stringa con la sintassi [], convertire la stringa in []rune in precedenza. Esempio (on play):

umlautsString := "Rhön" 
runes = []rune(umlautsString) 
fmt.Println(string(runes[0:3])) // Rhö 

Notevoli This golang blog post about string representation in go.

+0

Grazie per questa risposta. Non mi rendevo conto che era possibile convertire in '[] rune' - questo mi permetterà di ripulire parte del mio codice recente. –

+0

"I caratteri UTF-8 sono codificati come rune" non ha alcun senso. Potresti chiarirlo, riscriverlo o cancellarlo? – rightfold

+0

@rightfold Sei maleducato. Ha senso per almeno altre 9 persone, quindi eliminare la risposta è fuori questione. Avresti potuto chiedere gentilmente un chiarimento, ma in questo caso sembra che tu fossi troppo pigro per seguire uno dei link di nemo, che spiegano entrambi in dettaglio cosa sia una runa. – fresskoma

3

È possibile convertire string-[]rune e lavorare con esso:

package main 

import "fmt" 

func main() { 
    umlautsString := "Rhön" 

    fmt.Println(len(umlautsString)) 

    subStrRunes:= []rune(umlautsString) 

    fmt.Println(len(subStrRunes)) 

    fmt.Println(string(subStrRunes[0:4])) 
} 

http://play.golang.org/p/__WfitzMOJ

Speranza che aiuta!

Problemi correlati