2015-02-25 18 views
5

Aşağıdaki işlev, İsveççe karakterleriyle, yani å/Å/ä/Ä/ö/Ö ile çalışmaz.Go Lang in İsveççe karakterleri

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

Bir dizenin büyük harfli İsveç karakteri ile başlayıp başlamadığını kontrol etmeye nasıl başlarım? Bir string dizinleri de bayt değil, rünler (a rune bir Unicode kod noktası olan) Endeksleme

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

inanmak [unicode.IsUpper()] (https://golang.org/pkg/unicode/#IsUpper) bunun için yararlı olacaktır. –

cevap

9

: içinde

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

sonuçları.

Yapmak istediğiniz şey, ilk baytını UTF-8 kodlanmış biçiminde değil, string ilk karakterini (rune) kontrol etmektir. Ve bunun için standart kütüphanede destek var: unicode.IsUpper().

İlk rune'u almak için, string dosyasını bir dilim dilimine dönüştürebilir ve ilk öğeyi (0 dizininde) alabilirsiniz.

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

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

Çıkış:

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

'[] rune (s)' tüm dizeyi dönüştürür; Sadece ilk karakteri http://play.golang.org/p/OmOv3SMPu4 gibi bir şeyle ayıklayabilirsiniz. (İndeksleme bayt alırsa da, '' string dizgesini 'run'ları almak için UTF-8'i çözer.] – twotwotwo

+1

" İlk karakteri değil, sadece ilk * kod noktasını * çıkartabilirsiniz "demeliydim. Unicode'daki "karakter" kavramı, işaretlerin, RTL yön işareti gibi baskısız şeylerin birleştirilmesi vb. Için ekstra karmaşıktır. Birçok amaç için ilk rune olsa da iyidir. – twotwotwo

+1

@twotwotwo Evet, 'range', ilk koşuyu almanın daha hızlı bir yoludur. Soru kısa dizeler içerdiğinden, "rune" dilime dönüştürmek daha basittir. Uzun dizeler için "aralık" kullanılmalı veya ['utf8.DecodeRune()'] (http://golang.org/pkg/unicode/utf8/#DecodeRune) veya ['utf8.DecodeRuneInString()'] (http : //golang.org/pkg/unicode/utf8/#DecodeRuneInString). – icza