Почему эти символы не отображаются при переворачивании строки?

#string #go #reverse

#строка #Вперед #обратный

Вопрос:

Мне просто интересно, почему эти азиатские символы в этой строке не отображаются, когда я переворачиваю и печатаю отдельные символы в строке.

 package main

import "fmt"

func main() {

        a := "The quick brown 狐 jumped over the lazy 犬"
        var lenght int = len(a) - 1

        for ; lenght > -1; lenght-- {

                 fmt.Printf("%c", a[lenght])
        }
        fmt.Println()
}
 

Комментарии:

1. Многобайтовые символы.

2. @MattBall ты уверен? Я думаю, что go использует строки, состоящие из рун.

3. @EricUrban Я не особенно знаком с Go, но я уверен, что это проблема. Индексирование строки обращается к отдельным байтам, а не к символам.

Ответ №1:

Вы обращаетесь к массиву строк по байту, а не по «логическому символу», чтобы лучше понять, что этот пример сначала разбивает строку как массив рун, а затем печатает руну в обратном направлении.

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

 package main

import "fmt"

func main() {
    msg := "The quick brown 狐 jumped over the lazy 犬"

    elements := make([]rune, 0)

    for _, rune := range msg {
        elements = append(elements, rune)
    }

    for i := len(elements) - 1; i >= 0; i-- {
        fmt.Println(string(elements[i]))
    }
}
 

Более короткая версия: http://play.golang.org/p/PYsduB4Rgq

 package main

import "fmt"

func main() {
    msg := "The quick brown 狐 jumped over the lazy 犬"

    elements := []rune(msg)

    for i := len(elements) - 1; i >= 0; i-- {
        fmt.Println(string(elements[i]))
    }
}