2015-02-25 17 views
5

La seguente funzione non funziona con caratteri svedesi, ad esempio å/Å/ä/Ä/ö/Ö.Personaggi svedesi in Go Lang

func StartsWithUppercase(s string) bool { 
    return (string(s[0]) == strings.ToUpper(string(s[0]))) 
} 

Come si procede per verificare se una stringa inizia con carattere maiuscolo svedese?

w := "åÅäÄöÖ" 
for i := 0; i < len(w); i++ { 
    fmt.Println(i, w[i]) 
} 

risultati in:

1. 195 
2. 165 
3. 195 
4. 133 
5. 195 
6. 164 
7. 195 
8. 132 
9. 195 
10. 182 
11. 195 
12. 150 
+2

Credo [unicode.IsUpper()] (https://golang.org/pkg/unicode/#IsUpper) sarebbe utile per questo. –

risposta

9

indicizzare una string indici suoi byte non sue runes (un rune è un codepoint unicode).

Quello che si vuole fare è controllare il primo carattere (rune) del string, non il suo primo byte nella sua forma codificata UTF-8. E per questo c'è supporto nella libreria standard: unicode.IsUpper().

Per ottenere il primo rune, è possibile convertire lo string in una porzione di rune e prendere il primo elemento (all'indice 0).

ins := []string{ 
    "å/Å/ä/Ä/ö/Ö", 
    "Å/ä/Ä/ö/Ö"} 

for _, s := range ins { 
    fmt.Println(s, unicode.IsUpper([]rune(s)[0])) 
} 

uscita:

å/Å/ä/Ä/ö/Ö false 
Å/ä/Ä/ö/Ö true 
+4

'[] rune (s)' converte l'intera stringa; puoi estrarre solo il primo personaggio con qualcosa come http://play.golang.org/p/OmOv3SMPu4. (Anche se l'indicizzazione diventa byte, 'range'ing sulla stringa decodifica l'UTF-8 per ottenere le rune.) – twotwotwo

+1

Avrei dovuto dire" puoi estrarre solo il primo * punto codice *, "non" il primo carattere ". La nozione di "caratteri" in Unicode è estremamente complicata grazie alla combinazione di marchi, elementi non stampabili come il segno di direzione RTL e così via. Per molti scopi, tuttavia, la prima runa va bene. – twotwotwo

+1

@twotwotwo Sì, 'range' è un modo più veloce per ottenere la prima runa. Poiché la domanda conteneva stringhe brevi, la conversione in una sezione 'rune' è più semplice. Per le stringhe lunghe è necessario utilizzare 'range' o [' utf8.DecodeRune() '] (http://golang.org/pkg/unicode/utf8/#DecodeRune) o [' utf8.DecodeRuneInString() '] (http : //golang.org/pkg/unicode/utf8/#DecodeRuneInString). – icza