Nano Hash - криптовалюты, майнинг, программирование

Чтение символов Юникода с помощью сканера bufio в Go

Я пытаюсь прочитать простой текстовый файл, содержащий такие имена: "CASTAÑEDA"

Код в основном такой:

file, err := os.Open("C:/Files/file.txt")
defer file.Close()
if err != nil {
    log.Fatal(err)
}
scanner := bufio.NewScanner(file)
for scanner.Scan() {
    fmt.Println(scanner.Text())
}

Затем, когда читается «CASTAÑEDA», печатается «CASTAÑEDA».

Есть ли способ обрабатывать эти символы при чтении с помощью bufio?

Спасибо.

16.04.2015

  • Ваш терминал поддерживает utf8? правильно ли он печатает, если вы cat file.txt? также это может быть неправильная кодировка. 17.04.2015
  • Например. это в UTF-16 или что-то в этом роде? (Если это так, см. unicode/utf16) 17.04.2015

Ответы:


1

Проблема, с которой вы столкнулись, заключается в том, что ваш ввод, скорее всего, не UTF-8 (это то, что ожидают bufio и большинство языков Go/stdlib). Вместо этого ваш ввод, вероятно, использует некоторую расширенную кодовую страницу ASCII, поэтому символы без диакритических знаков проходят чисто (UTF-8 также является надмножеством 7-битного ASCII), но что «Ñ» не передается без изменений.

В этой ситуации битовое представление символа с акцентом не является допустимым UTF-8, поэтому создается символ замены Unicode (U+FFFD). У вас есть несколько вариантов:

  1. Преобразуйте входные файлы в UTF-8 перед передачей их в Go. Есть много утилит, которые могут это сделать, и редакторы часто имеют эту функцию.
  2. Попробуйте использовать golang.org/x/text/encoding/charmap вместе с NewReader с golang.org/x/text/transform для преобразования ввода в UTF. -8. Передайте полученный Reader в bufio.NewScanner
  3. Измените строку в цикле на os.Stdout.Write(scanner.Bytes()); fmt.Println(); Это может предотвратить интерпретацию байтов как UTF-8 за пределами разделения новой строки. Запись байтов непосредственно в os.Stdout позволит избежать любой (неправильной) интерпретации содержимого.
17.04.2015
  • Большое спасибо за ответ, я наконец-то использую charmap следующим образом: charconv := transform.NewReader(file, charmap.Windows1252.NewDecoder()) 20.04.2015

  • 2

    Ваш файл, скорее всего, не UTF-8. Из-за этого (go ожидает, что все строки будут UTF-8) вывод вашей консоли выглядит искаженным. Я бы посоветовал использовать пакеты golang.org/x/text/encoding/charmap и golang.org/x/text/transform в вашем случае, чтобы преобразовать данные файла в UTF-8. Как я мог бы предположить, глядя на путь к вашему файлу, вы работаете в Windows. Таким образом, ваша кодировка символов может быть Windows1252 (если вы редактировали ее, например, с помощью notepad.exe).

    Попробуйте что-то вроде этого:

    package main
    
    import (
        "bufio"
        "fmt"
        "log"
        "os"
    
        "golang.org/x/text/encoding/charmap"
        "golang.org/x/text/transform"
    )
    
    func main() {
        file, err := os.Open("C:/temp/file.txt")
        defer file.Close()
        if err != nil {
            log.Fatal(err)
        }
    
        dec := transform.NewReader(file, charmap.Windows1252.NewDecoder()) <- insert your enconding here
    
        scanner := bufio.NewScanner(dec)
        for scanner.Scan() {
            fmt.Println(scanner.Text())
        }
    }
    

    Вы можете найти больше кодировок в пакете golang.org/x/text/encoding/charmap, которые вы можете вставить в мой пример по своему вкусу.

    20.04.2015
  • Должен ли я закрыть декодер или считыватель, возвращенный из transform.NewReader? 17.08.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..