xml: кодировка "utf-16" объявлена, но Decoder.CharsetReader - ноль. - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь разобрать XML-фид, содержащий немецкие символы (например, ß, ä, Ö, ü и т. Д.), В структуру, что приводит к ошибке: xml: encoding "utf-16" declared but Decoder.CharsetReader is nil unmarshal successful

По сути, это то, чтоЯ делаю (опущена проверка ошибок для частей, которые работают):

resp, _ := http.Get(url)
defer resp.Body.Close()
bodyBytes, _ := ioutil.ReadAll(resp.Body)
err = xml.Unmarshal(bodyBytes, &target)
if err != nil {
  fmt.Println(err)
}

Я пытался преобразовать XML в JSON, используя github.com/basgys/goxml2json, я пытался преобразовать в строку и обратно в [] перед байтом unmarshal, я пытался использовать различные декодеры, размещенные в других SO-ответах (поскольку в нем говорится, что читатель charset равен nil), например:

reader := bytes.NewReader(bodyBytes)
decoder := xml.NewDecoder(reader)
decoder.CharsetReader = charset.NewReader
err = decoder.Decode(&target)
if err != nil {
  fmt.Println(err)
}

Независимо от того, что я пробовал, он не сможетunmarshal / decode xml feed в структуру .. в некоторых случаях происходит преобразование всего текста на китайский, а не на немецкий.

1 Ответ

0 голосов
/ 12 июня 2018

Если charset.NewReader, который вы используете во втором примере, имеет значение https://godoc.org/golang.org/x/net/html/charset, то код даже не должен компилироваться, поскольку поле CharsetReader имеет подпись, отличную от NewReader.


Чтобы исправить ошибку, вы можете предоставить «идентичный» считыватель кодировок, то есть тот, который возвращает ввод без изменений.

func identReader(encoding string, input io.Reader) (io.Reader, error) {
    return input, nil
}

// ...

decoder.CharsetReader = identReader

https://play.golang.org/p/BiU4T2qz1Z1


ПРИМЕЧАНИЕ : вышеприведенное решение работает для примеров символов из вопроса, но вполне может дать сбой для других строк utf16.В таком случае вместо identReader.

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