Umlauts и ломтики
У меня возникают проблемы при чтении файла с фиксированным размером длины столбца. Некоторые столбцы могут содержать умлауты.
Umlauts, похоже, использует 2 байта вместо одного. Это не то поведение, которое я ожидал. Есть ли какая-либо функция, которая возвращает подстроку? В данном случае, как представляется, Slice не работает.
Вот пример кода:
http://play.golang.org/p/ZJ1axy7UXe
umlautsString := "Rhön"
fmt.Println(len(umlautsString))
fmt.Println(umlautsString[0:4])
Печать
5
Rhö
Ответы
Ответ 1
В go, фрагмент строки подсчитывает байты, а не руны. Вот почему "Rhön"[0:3]
дает вам Rh
и первый байт ö
.
Символы, закодированные в UTF-8, представлены как руны, потому что UTF-8 кодирует символы более чем в одном
байт (до четырех байтов), чтобы обеспечить больший диапазон символов.
Если вы хотите нарезать строку синтаксисом []
, сначала преобразуйте строку в []rune
.
Пример (в игре):
umlautsString := "Rhön"
runes = []rune(umlautsString)
fmt.Println(string(runes[0:3])) // Rhö
Обращает на себя внимание: Это сообщение в блоге golang о представлении строки в go.
Ответ 2
Вы можете преобразовать string
в []rune
и работать с ним:
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
Надеюсь, что это поможет!