Как получить подстроку из строки рун в Голанге?

Я нашел это, https://groups.google.com/forum/, но, насколько я могу судить, решения не сработали для меня.

Если вы используете метод обработки строки в качестве среза (str[:20]), он разрывается в середине символов, и мы получаем "ال ".

Изменить: я думаю, что я мог бы написать функцию и сделать это как кратное 3, поскольку руны являются int32 (32 бит /(8 бит / байт)). Сначала я должен проверить, есть ли руны.

4 ответа

Решение

Просто сначала преобразуйте его в кусочек руны, затем преобразовайте результат обратно:

string([]rune(str)[:20])

Вы можете получить подстроку строки UTF-8 без выделения дополнительной памяти (вам не нужно преобразовывать ее в rune ломтик):

func substring(s string, start int, end int) string {
    start_str_idx := 0
    i := 0
    for j := range s {
        if i == start {
            start_str_idx = j
        }
        if i == end {
            return s[start_str_idx:j]
        }
        i++
    }
    return s[start_str_idx:]
}

func main() {
    s := "世界 Hello"
    fmt.Println(substring(s, 0, 1)) // 世
    fmt.Println(substring(s, 1, 5)) // 界 He
    fmt.Println(substring(s, 3, 8)) // Hello
}

Вот реализация на основе длины, основанная на уловке с рунами:

func substr(input string, start int, length int) string {
    asRunes := []rune(input)

    if start >= len(asRunes) {
        return ""
    }

    if start+length > len(asRunes) {
        length = len(asRunes) - start
    }

    return string(asRunes[start : start+length])
}

Если вы не против экспериментального пакета, вы можете использовать это:

      package main
import "golang.org/x/exp/utf8string"

func main() {
   a := utf8string.NewString("ÄÅàâäåçèéêëìîïü")
   s := a.Slice(1, 3)
   println(s == "Åà")
}

https://pkg.go.dev/golang.org/x/exp/utf8string

Другие вопросы по тегам