【问题标题】:Error in exporting other language text as ???? in tally data将其他语言文本导出为 ???? 时出错在计数数据中
【发布时间】:2022-10-20 15:07:01
【问题描述】:

从 tally 导出 tally 数据时,它支持多语言文本,但在从其他来源(如 cmd 或邮递员请求)执行 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

标头=> 内容类型:应用程序/xml;字符集=utf-8

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

UTF-16

标头=> 内容类型:应用程序/xml;字符集=utf-16

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

使用卷曲命令

  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 是其他语言的文本结果将是 ????

在计数开发工具上运行时,它支持多语言文本,但在发布请求或使用 curl 命令时意味着它不支持

【问题讨论】:

    标签: node.js xml curl encoding tally


    【解决方案1】:

    它与语言无关,它与用于计数以发送响应的编码有关

    如果您以 utf-8 编码发送请求,您将仅以 utf-8 获得响应

    为了正确使用 utf-16 编码获取数据

    如果您使用任何编程语言发送请求,则可以将请求 xml 编码为 utf-16,然后您将正确获得响应

    使用 utf-8 编码的邮递员响应

    从邮递员发送 UTF-16 编码的请求

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

    配置邮递员

    在正文选项卡下的邮递员中,选择二进制选项卡并选择您在前面步骤中保存的文件

    在标题选项卡中

    添加新标题

    键 - 内容类型值 - 应用程序/xml;字符集=utf-16

    【讨论】:

    • 是的 UTF-16 在邮递员中不起作用,任何可能的方式在邮递员上对其进行编码
    • @Abisha 编辑了答案,包括在邮递员中手动编码 xml 的方法。不要忘记将答案标记为解决方案
    • 我尝试了以前的方法,但只得到这样的响应.. <RESPONSE>未知请求,无法处理</RESPONSE>
    • 以前的方法意味着,使用任何中间语言,如果是,则发布您正在使用的代码
    • 现在请检查上述查询
    【解决方案2】:

    示例 NodeJs 代码段

    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()
    

    输出:

    【讨论】:

      猜你喜欢
      • 2018-01-18
      • 2015-09-22
      • 2019-10-18
      • 2013-06-22
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 2012-02-18
      • 2017-06-21
      相关资源
      最近更新 更多