Выбор ответа Middle Строки, байты и руны обновлено
Разворот строки с кириллицей
Вопрос
Почему разворот строки побайтно ломает строку «привет» и как правильно?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: UTF-8 символы разорвутся; разворачивать надо []rune(s). Строки Go это UTF-8 байты; кириллическая буква занимает 2 байта, и при развороте байтов пара переворачивается, получая невалидные последовательности.
Варианты ответа
- Побайтно сработает: Go хранит строки в UTF-32
- UTF-8 символы разорвутся; разворачивать надо
[]rune(s)правильный ответ - Нужно перевести строку в
[]byte, развернуть и вызватьutf8.Valid - Строку развернуть нельзя, только слайс байтов
Разбор
Строки Go это UTF-8 байты; кириллическая буква занимает 2 байта, и при развороте байтов пара переворачивается, получая невалидные последовательности. Работают с рунами: r := []rune(s), разворот, string(r). UTF-32 Go не использует. utf8.Valid лишь проверит, что получилась ерунда. Ограничение: составные эмодзи и буквы с комбинируемыми знаками и рунами разорвутся.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Строки, байты и руны»
- Байты и символы в строке Go
- Разворот строки с кириллицей на Go
- Сжатие RLE для строк UTF-8 на Go
- Палиндром с кириллицей и знаками на Go
- Перенос текста по ширине в символах на Go
- Что выведет Go: len и range по строке с кириллицей
- Что выведет Go: руны, байты и преобразования
- Что выведет Go: сравнение и срезы строк