Страницы

Поиск по вопросам

среда, 12 июня 2019 г.

Golang xml encoding=“windows-1251”

Пишу парсер для xml файлов, но проблема в том, что в файле кодировка: encoding="windows-1251". Когда перевел кодировку в ut8 то следующем кодом смог распарсить документ.
for _, file := range files { _, filename := utils.Unzip("/Users/farex/upload/"+file.Filename, "/Users/farex/upload/") _ = filename ///---------- Open our xmlFile----------------------- for _, file := range filename { xmlFile, err := os.Open("/Users/farex/upload/" + file) // if we os.Open returns an error then handle it if err != nil { fmt.Println(err) } fmt.Println("Successfully Opened " + file)
if utils.Cut(file, 1) == "H" {
defer xmlFile.Close()
byteValue, _ := ioutil.ReadAll(xmlFile) var zl_list models.ZL_LIST
xml.Unmarshal(byteValue, &zl_list)
fmt.Println("---ZGLV---") fmt.Println("VERSION" + zl_list.ZGLV[0].VERSION) fmt.Println("DATA" + zl_list.ZGLV[0].DATA) fmt.Println("FILENAME" + zl_list.ZGLV[0].FILENAME) fmt.Println("SD_z" + zl_list.ZGLV[0].SD_Z)
Это все работает, но задача парсить не Документы в формате utf8 , а в cp-1251. Как можно "конвертировать" cp-1251 в utf-8 ? Добавил меторд:
func EncodeWindows1251(ba []uint8) []uint8 { enc := charmap.Windows1251.NewEncoder() out, _ := enc.String(string(ba)) return []uint8(out) }
и соответственно вызываю его:
byteValue, _ := ioutil.ReadAll(xmlFile) a := EncodeWindows1251(byteValue) var zl_list models.ZL_LIST xml.Unmarshal(a, &zl_list)
Тоже не работает... Но если из документа убрать строку То все работает и документ парсится... Неужели придется регуляркой удалять эту строчку в документе?
Добавил метод наисанный ниже и за импортировал. "golang.org/x/text/encoding/charmap". Но:
Образец файла xml тут кодировка cp-1251


Ответ

Для этого существует поле Decoder.CharsetReader
// CharsetReader, if non-nil, defines a function to generate // charset-conversion readers, converting from the provided // non-UTF-8 charset into UTF-8. If CharsetReader is nil or // returns an error, parsing stops with an error. One of the // the CharsetReader's result values must be non-nil. CharsetReader func(charset string, input io.Reader) (io.Reader, error)
Использовать можно так:
d := xml.NewDecoder(xmlFile) d.CharsetReader = func(charset string, input io.Reader) (io.Reader, error) { switch charset { case "windows-1251": return charmap.Windows1251.NewDecoder().Reader(input), nil default: return nil, fmt.Errorf("unknown charset: %s", charset) } } err := d.Decode(&zlList)

Комментариев нет:

Отправить комментарий