Страницы

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

среда, 4 марта 2020 г.

Golang xml encoding=“windows-1251”

#xml #golang #utf_8 #xmlparser #cp1251


Пишу парсер для 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
    


Ответы

Ответ 1



Для этого существует поле 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)

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

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