curl 在理货数据中导出其他语言文本为????时出错

mspsb9vt  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(90)

从理货中导出理货数据时,支持多语言文本,但从其他来源(如cmd或 Postman 请求)执行xml文件时,返回其他语言文本,如????符号
我的密码是

<?xml version="1.0" encoding="UTF-8"?>
  <ENVELOPE>
  <HEADER>
   <TALLYREQUEST>ExportData</TALLYREQUEST>
   </HEADER>
   <BODY>
   <EXPORTDATA>
   <REQUESTDESC>
   <REPORTNAME>TNetSA LedgerSalesorders</REPORTNAME>
   <STATICVARIABLES>
   <SVCURRENTCOMPANY>${companyName}</SVCURRENTCOMPANY>                                          
   <SVFROMDATE>${fromDate}</SVFROMDATE>
   <SVTODATE>${toDate}</SVTODATE>
   <SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>  
   </STATICVARIABLES>
   </REQUESTDESC>
   </EXPORTDATA>
   </BODY>
   </ENVELOPE>

发布请求****UTF-8

表头=〉内容类型:application/xml;字符集=utf-8
https://i.stack.imgur.com/T9WDW.png

UTF-16编码格式

表头=〉内容类型:application/xml;字符集=utf-16
https://i.stack.imgur.com/S4J7H.png

使用 curl 命令

curlcommand = cd  C:\Users\..\Data\ && curl -H "Content-Type: text/plain; charset=UTF-8" localhost:9001 --data @Basic\I_SPND.xml

https://i.stack.imgur.com/PJpAK.png

节点js:

const asynchronousProcess = () => {
    var inputFilename = Path + 'I_SPND.xml';//path of the stored above xml code
    fs.writeFile(inputFilename, values, 'utf8', function (err) {
        if (err) {
            return console.log(err);
        }
    });
    return new Promise((resolve, reject) => {
        let cmd = curlcommand; // above mentioned curl command
        exec(cmd, (error, stdout, stderr) => {
            if (error) {
                reject(error);
            }
            resolve(stdout ? stdout : stderr);
        });
        
    });
}

例如:如果PartyLedgerName为其他语言文本,则结果将为????
当在tally开发工具上运行时,它支持多语言文本,但在post请求或使用curl命令时,意味着它不支持

voase2hg

voase2hg1#

需要安装“node-fetch”:“^3.2.10日期”

NodeJ代码段示例

import fetch from 'node-fetch';

let SourceXml = "<ENVELOPE Action=\"\"><HEADER><VERSION>1</VERSION><TALLYREQUEST>EXPORT</TALLYREQUEST><TYPE>COLLECTION</TYPE><ID>CUSTOMLEDGERCOL</ID></HEADER><BODY><DESC><STATICVARIABLES /><TDL><TDLMESSAGE><COLLECTION ISMODIFY=\"No\" ISFIXED=\"No\" ISINITIALIZE=\"No\" ISOPTION=\"No\" ISINTERNAL=\"No\" NAME=\"CUSTOMLEDGERCOL\"><TYPE>LEDGER</TYPE><FETCH>   NAME </FETCH><FILTERS>LedgFilter</FILTERS></COLLECTION><SYSTEM TYPE=\"Formulae\" NAME=\"LedgFilter\">$Name = \"Test Party_altered\"</SYSTEM></TDLMESSAGE></TDL></DESC></BODY></ENVELOPE>"
let buffer = Buffer.from(SourceXml, 'utf16le')

function test() {
    fetch('http://localhost:9000', {
        method: 'POST', body: buffer, headers: {
            'Content-Type': 'application/xml; charset=utf-16',
        },
    })
        .then(res => res.blob())
        .then(async data => {
            const buffer = Buffer.from(await data.arrayBuffer());
            console.log(buffer.toString('utf16le'));
        })
}
test()

输出:

hgqdbh6s

hgqdbh6s2#

这与语言无关,而是与发送响应计数中使用的编码有关
如果您以utf-8编码发送请求,您将只得到以utf-8编码的响应
为了从正确地使用utf-16编码获取数据
如果您使用任何编程语言来发送请求,那么您可以将请求xml编码为utf-16,这样您将得到正确的响应。

采用utf-8编码的 Postman 响应

从 Postman 发送UTF-16编码的请求

将以xml格式发送的xml保存在文本文件中,保存时使用编码utf-16

**配置 Postman **

在正文选项卡下的postman中选择二进制选项卡,然后选择您在前面步骤中保存的文件
在标题标签中
添加新标题
关键字-内容类型值-应用程序/xml;字符集=utf-16

相关问题