2013-10-17 20 views
10

Sabit sütun uzunluğuna sahip bir dosya okunurken sorun yaşıyorum. Bazı sütunlarda umlauts bulunabilir.İçindekiler ve dilimleri

Arayanlar, bir yerine 2 bayt kullanıyor görünüyor. Beklediğim davranış bu değil. Bir alt dize döndüren herhangi bir işlev var mı? Dilim bu durumda işe yaramaz.

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

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

Baskılar:

halindeyken olarak
5 
Rhö 

cevap

12

, bir dize bir dilim değil runes bayt sayar

İşte bazı örnek kod var. Bu nedenle "Rhön"[0:3] size Rh ve ö ilk baytını verir. UTF-8 karakterden daha büyük bir aralık temin etmek üzere (dört bayta kadar) birden fazla bayt karakter kodlar için UTF-8 kodlanmış

karakterler rün olarak temsil edilir.

[] sözdizimini içeren bir dize dilimlemek istiyorsanız, dize önce []rune olarak dönüştürün. Örnek (on play):

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

Dikkate değer: This golang blog post about string representation in go.

+0

Bu cevap için teşekkürler. '[] Rune' 'ye dönüştürmenin mümkün olduğunu bilmiyordum - bu benim son kodumdan bazılarını temizlememe izin verecek. –

+0

“UTF-8 karakterleri runes olarak kodlandı” hiç bir anlam ifade etmiyor. Açıklığa kavuşabilir, yeniden yazabilir veya silebilir misiniz? – rightfold

+0

@rightfold Kabalaşıyorsunuz. En az 9 kişi daha mantıklıydı, bu yüzden cevabın silinmesi söz konusu değil. Bir açıklama için iyi bir soru sorabilirdin, ama bu durumda, her ikisinin de ayrıntılı bir şekilde ne olduğunu anlatan nemo yayınlarından birini takip etmek için çok tembel davrandın. – fresskoma

3

Sen []rune için string dönüştürmek ve onunla çalışabilirsiniz: yardımcı

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

Umut!