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

Надеюсь, что это поможет!