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>
在 Linux 上使用 view
或 cat
:
<?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><?xml version="1.0" encodi®æå</Remark></Head></ATKCST>>unCode>9000</FunCode><Remark>æ¥æ¶æ°æ
</ns31:UploadInboundResult>
</ns31:UploadInboundResponseElement>
</soapenv:Body>
</soapenv:Envelope>
在 Linux 上使用 file
命令:
$ file -b --mime-encoding response.xml
$ utf-8
在 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><?xml version="1.0" encoding="UTF-8" ?><ATKCST><Head><FunCode>9000</FunCode><Remark>接收数据成功</Remark></Head></ATKCST></ns31:UploadInboundResult>
</ns31:UploadInboundResponseElement>
</soapenv:Body>
</soapenv:Envelope>
然而,当我在 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
我在 Linux 上有一个 XML 文件 (response.xml),我正在尝试使用 awk/sed/grep 等进行解析。XML 文件包含一些汉字,我正在尝试获取 FunCode
的值<FunCode>9000</FunCode>
在 Linux 上使用
view
或cat
:<?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><?xml version="1.0" encodi®æå</Remark></Head></ATKCST>>unCode>9000</FunCode><Remark>æ¥æ¶æ°æ </ns31:UploadInboundResult> </ns31:UploadInboundResponseElement> </soapenv:Body> </soapenv:Envelope>
在 Linux 上使用
file
命令:$ file -b --mime-encoding response.xml $ utf-8
在 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><?xml version="1.0" encoding="UTF-8" ?><ATKCST><Head><FunCode>9000</FunCode><Remark>接收数据成功</Remark></Head></ATKCST></ns31:UploadInboundResult> </ns31:UploadInboundResponseElement> </soapenv:Body> </soapenv:Envelope>
然而,当我在 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