Sobes.tech
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.