XML UTF-8/ISO-8859-1 在 Linux 上用汉字编码的问题

Issue with XML UTF-8/ISO-8859-1 encoding with Chinese characters on Linux

我在 Linux 上有一个 XML 文件 (response.xml),我正在尝试使用 awk/sed/grep 等进行解析。XML 文件包含一些汉字,我正在尝试获取 FunCode

的值
<FunCode>9000</FunCode>
  1. 在 Linux 上使用 viewcat:

    <?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. 在 Linux 上使用 file 命令:

    $ 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 上,我无法搜索和获取 FunCode 的值“9000”。

关于如何在 Linux 上格式化文件以便获得 FunCode 的值的任何想法?我尝试使用 "iconv",但没有帮助。

您在 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