Хобрук: Ваш путь к мастерству в программировании

Проблема с кодировкой XML UTF-8 / ISO-8859-1 с китайскими символами в Linux

У меня есть XML-файл (response.xml) в Linux, который я пытаюсь проанализировать с помощью awk / sed / grep и т. Д. XML-файл содержит некоторые китайские символы, и я пытаюсь получить значение FunCode

<FunCode>9000</FunCode>
  1. Использование view или cat в Linux:

    <?xml version='1.0' encoding='UTF-8'?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
        <soapenv:Body>
            <ns31:UploadInboundResponseElement xmlns:ns31="http://www.example.com/schema/xyzWS">
                <ns31:UploadInboundResult>&lt;?xml version="1.0" encodi®æå&lt;/Remark>&lt;/Head>&lt;/ATKCST>>unCode>9000&lt;/FunCode>&lt;Remark>æ¥æ¶æ°æ
                </ns31:UploadInboundResult>
            </ns31:UploadInboundResponseElement>
        </soapenv:Body>
    </soapenv:Envelope>
    
  2. Используя команду file в Linux:

    $ file -b --mime-encoding response.xml
    $ utf-8
    
  3. В Windows с использованием Блокнота файл выглядит так. Обратите внимание на кодировку UTF-8:

    <?xml version='1.0' encoding='UTF-8'?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
        <soapenv:Body>
            <ns31:UploadInboundResponseElement xmlns:ns31="http://www.example.com/schema/xyzWS">
                <ns31:UploadInboundResult>&lt;?xml version="1.0" encoding="UTF-8" ?>&lt;ATKCST>&lt;Head>&lt;FunCode>9000&lt;/FunCode>&lt;Remark>接收数据成功&lt;/Remark>&lt;/Head>&lt;/ATKCST></ns31:UploadInboundResult>
            </ns31:UploadInboundResponseElement>
        </soapenv:Body>
    </soapenv:Envelope>
    
  4. Тем не менее, когда я открываю файл с помощью любого веб-браузера в Windows, он показывает это. Обратите внимание на кодировку ISO-8859-1:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
        <soapenv:Body>
            <ns31:UploadInboundResponseElement xmlns:ns31="http://www.example.com/schema/xyzWS">
                <ns31:UploadInboundResult>
                    <?xml version="1.0" encoding="UTF-8" ?>
                    <ATKCST>
                        <Head>
                            <FunCode>9000</FunCode>
                            <Remark>接收数据成功</Remark>
                        </Head>
                    </ATKCST>
                </ns31:UploadInboundResult>
            </ns31:UploadInboundResponseElement>
        </soapenv:Body>
    </soapenv:Envelope>
    

Таким образом, файл в браузере отформатирован правильно, но меня смущает, почему Linux говорит, что файл закодирован в UTF-8, а внутри браузера он отображается как ISO-8859-1.

Это просто из-за «encoding = 'UTF-8'»?

Мой другой (главный) вопрос заключается в том, что в Linux я не могу найти и получить значение «9000» для FunCode.

Есть идеи, как отформатировать файл в Linux, чтобы получить значение FunCode? Я пробовал использовать "iconv", но это не помогло.


  • не рекомендуется, очень хрупкий, может выйти из строя, когда sed увидит китайские символы, не будет работать, если он разделен на одну или несколько строк (что является допустимым XML), ... вы должны использовать xmlstarlet, но .... здесь ты идешь echo "<FunCode>9000</FunCode>" | sed -n 's@<FunCode>@@;s@</FunCode>@@p'. Удачи. 27.08.2019
  • @shellter Это не типичный вопрос извлечения значения XML, он касается странной кодировки 27.08.2019
  • Похоже, ваш терминал Linux просто не поддерживает UTF-8 и искажает вывод. Блокнот правильно отображает значение XML с двойной кодировкой. Можете ли вы опубликовать файл в кодировке base64 или в шестнадцатеричном формате, чтобы можно было более внимательно изучить фактические данные? 27.08.2019
  • Я согласен, что здесь, кажется, много дополнительной информации, но O.P. действительно написал в верхней части Q - Я пытаюсь получить значение FunCode, поэтому мой комментарий. Просто говорю! ;-) Всем удачи. 27.08.2019
  • Я пытаюсь выполнить синтаксический анализ с помощью awk / sed / grep, - эти инструменты не понимают синтаксис XML, что в основном означает, что вам придется выполнять синтаксический анализ самостоятельно. С этим есть много проблем, хорошо задокументированных в других ответах SO, но конкретная проблема здесь, вероятно, заключается в том, что эти инструменты (не поддерживающие XML) не будут следовать правильным правилам XML для определения кодировки файла. Используйте настоящий XML-парсер. 27.08.2019
  • @ этот другой парень - да, странная кодировка - это то, что вызывает у меня проблемы в Linux. Если ‹FunCode› появился как обычный текст, я мог бы просто использовать следующее, чтобы получить значение: funcode = $ (sed -ne '/FunCode/{s/.* ‹FunCode› (. *) ‹\ / FunCode› . * / \ 1 / p; q;} 'response.xml) 27.08.2019

Ответы:


1

Беспорядок, который вы видите в Linux, скорее всего, связан с неправильно настроенным терминалом. Учитывая содержимое, которое вы видите в Блокноте, вам нужно будет декодировать UploadInboundResult как текст, переинтерпретировать его как XML и, наконец, получить свой элемент:

  $ xmlstarlet sel -T -N ns='http://www.example.com/schema/xyzWS' \
         -t -v '//ns:UploadInboundResult' response.xml |
      xmlstarlet sel -t -v '//FunCode' -n
  9000
26.08.2019
  • Я пробовал xmllint с различными параметрами, но ни один из них не работал. К сожалению, у меня на RHEL не установлен xmlstarlet :-(. Похоже, это единственный вариант 27.08.2019
  • Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..