Sobes.tech
Junior

Jak odczytać linię zawierającą hieroglify, cyrylicę i inne symbole?

sobes.tech AI

Odpowiedź od AI

W Golang, łańcuchy znaków domyślnie są reprezentowane w UTF-8, co umożliwia bezproblemową pracę z symbolami z różnych alfabetów, w tym hieroglifami i cyrylicą. Aby odczytać takie łańcuchy, wystarczy użyć funkcji i pakietów standardowych.

Odczyt z pliku:

import (
	"bufio"
	"fmt"
	"os"
)

func readStringFromFile(filename string) error {
	file, err := os.Open(filename)
	if err != nil {
		return fmt.Errorf("błąd otwarcia pliku: %w", err)
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		line := scanner.Text() // Linia jest już w UTF-8
		fmt.Println(line)
	}

	if err := scanner.Err(); err != nil {
		return fmt.Errorf("błąd skanowania pliku: %w", err)
	}
	return nil
}

Odczyt ze standardowego wejścia:

import (
	"bufio"
	"fmt"
	"os"
)

func readStringFromStdin() {
	reader := bufio.NewReader(os.Stdin)
	fmt.Print("Wprowadź łańcuch znaków: ")
	line, _ := reader.ReadString('\n') // Łańcuch jest odczytywany jako slice bajtów, a następnie konwertowany na string (UTF-8)
	fmt.Println("Wprowadziłeś:", line)
}

Iteracja po znakach (runach):

import "fmt"

func iterateString(s string) {
	for i, r := range s { // Range iteruje po runach (punktach kodu Unicode)
		fmt.Printf("Pozycja: %d, Runa: %c, Punkt kodu: %U\n", i, r, r)
	}
}

Kluczowe punkty:

  • Stringi w Golang są niezmiennymi sekwencjami bajtów.
  • Domyślnie używany jest UTF-8. Zapewnia to poprawną reprezentację znaków z różnych języków.
  • Iteracja po stringu za pomocą range przetwarza każdą runę (punkt kodu Unicode), a nie każdy bajt.

Dodatkowo:

Jeśli dane źródłowe nie są w UTF-8, może być konieczne przekształcenie kodowania przy użyciu pakietów z biblioteki standardowej lub bibliotek zewnętrznych, takich jak golang.org/x/text/encoding.