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ą
rangeprzetwarza 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.