2013-10-17 3 views
10

Je rencontre des problèmes lors de la lecture d'un fichier dont le format de colonne est fixe. Certaines colonnes peuvent contenir des trémas. Les trémas ont l'air d'utiliser 2 octets au lieu d'un. Ce n'est pas le comportement auquel je m'attendais. Y at-il un type de fonction qui renvoie une sous-chaîne? Slice ne semble pas fonctionner dans ce cas.Trémas et tranches

Voici quelques exemples de code:

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

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

Prints:

5 
Rhö 

Répondre

12

En route, une tranche d'une chaîne d'octets dénombre, non runes. C'est pourquoi "Rhön"[0:3] vous donne Rh et le premier octet de ö.

Les caractères codés en UTF-8 sont représentés comme des runes car UTF-8 code les caractères dans plusieurs octets (jusqu'à quatre octets) pour fournir une plus grande plage de caractères.

Si vous souhaitez découper une chaîne avec la syntaxe [], convertissez la chaîne en []rune avant. Exemple (on play):

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

remarquable: This golang blog post about string representation in go.

+0

Merci pour cette réponse. Je ne me suis pas rendu compte qu'il était possible de convertir en '[] rune' - cela me permettra de nettoyer une partie de mon code récent. –

+0

"Les caractères UTF-8 sont codés comme des runes" n'a aucun sens. Pourriez-vous le clarifier, le réécrire ou le supprimer? – rightfold

+0

@rightfold Vous êtes impoli. Cela a du sens pour au moins 9 autres personnes, donc la suppression de la réponse est hors de question. Vous auriez pu demander une clarification, mais dans ce cas, il semble que vous étiez trop paresseux pour suivre l'un des liens nemo posté, qui à la fois expliquer en détail ce qu'est une rune. – fresskoma

3

Vous pouvez convertir string-[]rune et travailler avec elle:

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

Hope that helps!