Конвертировать utf-8 в однобайтовую кодировку - PullRequest
0 голосов
/ 19 октября 2018

У меня есть партия неправильно закодированных записей.Этот однострочник дает мне правильный результат

cat example.txt | iconv -f utf-8 -t iso8859-2

Но следующая программа выдаёт мне ошибку encoding: rune not supported by encoding.

func main() {
    s:= []byte {196, 144, 194, 154, 196, 144, 194, 176, 196, 144, 197, 186, 196, 144, 196, 190, 197, 131, 194, 128, 196, 144, 194, 176, 32, 52, 52, 53, 54, 50, 53, 54, 10, 10, 0, 0, }
    fmt.Println(s)

    dec := charmap.ISO8859_2.NewEncoder()
    out, err := dec.Bytes(s)
    if err != nil {
        fmt.Println(err)
        return
    }
    expectedOutput := "Камера 4456256"      
    fmt.Println("result", string(out), "expect:", expectedOutput)
}

Мне интересно, можно ли решить мою проблему безпривязки iconv?

1 Ответ

0 голосов
/ 19 октября 2018

Поиск charmap.ISO8859_2 дает выражение, что вы используете golang.org / x / text .

Здесь мы видим, как выполняется преобразование, учитывая Charmap:

https://github.com/golang/text/blob/4d1c5fb19474adfe9562c9847ba425e7da817e81/encoding/charmap/charmap.go#L206

В отдельной строке указывается, откуда произошла ошибка.Таким образом, ваш ввод содержит символы в utf8, которые не могут быть представлены в iso8859-2 или недопустимом utf8.

Здесь вы видите, что ошибка передана вам добросовестно и использование replacement внутри RepertoireError, похоже, красная сельдь.

Конечно, вам не нужны привязки iconv.Вы можете просто перебирать вводимый символ за символом, кодировать его как iso8859-2 и решать, что делать с непредставимыми символами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...