Junior
Как да прочетем ред, съдържащ йероглифи, кирилица и други символи?
sobes.tech AI
Отговор от AI
В Golang низовете по подразбиране са представени във UTF-8, което позволява безпроблемна работа с символи от различни азбуки, включително йероглифи и кирилица. За четене на такива низове е достатъчно да използвате стандартните функции и пакети.
Четене от файл:
import (
"bufio"
"fmt"
"os"
)
func readStringFromFile(filename string) error {
file, err := os.Open(filename)
if err != nil {
return fmt.Errorf("грешка при отваряне на файла: %w", err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text() // Строката вече е във UTF-8
fmt.Println(line)
}
if err := scanner.Err(); err != nil {
return fmt.Errorf("грешка при сканиране на файла: %w", err)
}
return nil
}
Четене от стандартен вход:
import (
"bufio"
"fmt"
"os"
)
func readStringFromStdin() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Въведете низ: ")
line, _ := reader.ReadString('\n') // Низът се чете в слайс от байтове и след това се преобразува в string (UTF-8)
fmt.Println("Вие въведохте:", line)
}
Итериране по символи (руни):
import "fmt"
func iterateString(s string) {
for i, r := range s { // Range итерира по руни (Unicode кодови точки)
fmt.Printf("Позиция: %d, Руна: %c, Кодова точка: %U\n", i, r, r)
}
}
Основни моменти:
- В Golang низовете са неизменяеми последователности от байтове.
- По подразбиране се използва UTF-8 кодиране. Това гарантира коректното представяне на символи от различни езици.
- Итерацията по низ с
rangeобработва всяка руна (Unicode кодова точка), а не всеки байт.
Допълнително:
Ако изходните данни не са в UTF-8, може да се наложи преобразуване на кодировката с помощта на пакети от стандартната библиотека или външни библиотеки, например golang.org/x/text/encoding.