Javascript 下载文件时设置csv编码

Javascript 下载文件时设置csv编码,javascript,csv,encoding,papaparse,Javascript,Csv,Encoding,Papaparse,我正在使用react,并且 有了Paparse,我可以上传CSV并从Shift JS解码。但库不支持相反的操作 我添加了日文编码,以便将字符串转换为SHIFT js并下载 这是我的密码: const csv = csvParser.unparse({ "fields": ["行形式","取引番号","取引日","支払期限","顧客番号","顧客企業名","顧客電話番号","送付先郵便番号","請求書発行日","郵送","メール送付","取引金額","明細","単価","数

我正在使用react,并且

有了Paparse,我可以上传CSV并从Shift JS解码。但库不支持相反的操作

我添加了日文编码,以便将字符串转换为SHIFT js并下载

这是我的密码:

    const csv = csvParser.unparse({
        "fields": ["行形式","取引番号","取引日","支払期限","顧客番号","顧客企業名","顧客電話番号","送付先郵便番号","請求書発行日","郵送","メール送付","取引金額","明細","単価","数量","金額","消費税率","税込対象額_10%","税込対象額_8%","税込対象額_経8%","税込対象額_旧8%","税込対象額_非","税込対象額_対象外"],
        "data": [
            ["取引","transaction-20200218-094750_1","2020/02/18","2020/03/31","DP79","Sample1Corp","03-0000-0000","123-4567","2020/02/19","0","1","110","","","","","","110","","","",""]
        ]
    });
    const a = document.createElement("a");
    const sjisArray = Encoding.convert(csv, 'SJIS', 'UTF8');
    console.log(sjisArray)
    a.href = window.URL.createObjectURL(new Blob(['\ufeff'+sjisArray], {type: "text/csv;charset=shift-js"}));
    a.download = "取引サンプル.csv";
    a.click();
它不会抛出错误,但当我在记事本中打开我的csv文件时,它仍然是带有BOM的UTF8格式

我想把它换成js

我怎样才能做到这一点

您的编码库当前正在返回一个DOMString,因为您传递了这样一个DOMString作为输入。 这意味着您的Blob构造函数将把这个DOMString转换为UTF-8,这就是您文件中的内容:Shift-JIS编码文本的UTF-16表示的UTF-8版本

至少可以说,那不是你想要的

快速查看该库的文档,似乎最好是传递要编码的文本的ArrayBuffer版本,这样它会像Uint8Array一样返回一个字节值数组,除非出于任何原因使用普通数组

然后从这个字节数组中,您将能够生成一个新的ArrayBuffer,您将能够将它传递到Blob,而无需将其转换回UTF-8

const csv=Papa.unparse{ 字段:[行形式,取引番号,取引日,支払期限,顧客番号,顧客企業名,顧客電話番号,送付先郵便番号,請求書発行日,郵送,メール送付,取引金額,明細,単価,数量,金額,消費税率,税込対象額_10%,税込対象額_8%,税込対象額_経8%,税込対象額_旧8%,税込対象額_非,税込対象額_対象外], 数据:[ [取引,事务处理-20200218-094750_12020/02/182020/03/31,DP79,Sample1Corp,03-0000-0000123-456720/02/19,0,1110,,,,,,,,110,,] ] }; //首先将DOMString转换为ArrayBuffer const utf8Array=new textcoder.encode csv; //将它传递给Encoding,这样我们就可以得到一个字节数组 const sjisArray=Encoding.convertutf8Array,'SJIS','UTF8'; //现在我们可以在不自动编码的情况下生成Blob const blob=new blob[new Uint8Array sjisArray]; const a=document.createElement'a'; a、 下载='Shift JIS.csv'; a、 href=URL.createObjectURL blob; a、 text内容='下载'; document.body.append a; //只是为了检查我们编码是否正确 readAsText blob,“Shift JIS” .then txt=>console.log“读回为Shift JIS:”,txt; readAsText blob,“utf-8” .then txt=>console.log“读回为UTF-8:”,txt; 函数readAsText blob,编码{ 返回新的承诺res,rej=>{ const reader=新文件读取器; reader.onerror=rej; reader.onload=evt=>res reader.result; reader.readAsText blob,编码; } ; } 您的编码库当前正在返回一个DOMString,因为您传递了这样一个DOMString作为输入。 这意味着您的Blob构造函数将把这个DOMString转换为UTF-8,这就是您文件中的内容:Shift-JIS编码文本的UTF-16表示的UTF-8版本

至少可以说,那不是你想要的

快速查看该库的文档,似乎最好是传递要编码的文本的ArrayBuffer版本,这样它会像Uint8Array一样返回一个字节值数组,除非出于任何原因使用普通数组

然后从这个字节数组中,您将能够生成一个新的ArrayBuffer,您将能够将它传递到Blob,而无需将其转换回UTF-8

const csv=Papa.unparse{ 字段:[行形式,取引番号,取引日,支払期限,顧客番号,顧客企業名,顧客電話番号,送付先郵便番号,請求書発行日,郵送,メール送付,取引金額,明細,単価,数量,金額,消費税率,税込対象額_10%,税込対象額_8%,税込対象額_経8%,税込対象額_旧8%,税込対象額_非,税込対象額_対象外], 数据:[ [取引,事务处理-20200218-094750_12020/02/182020/03/31,DP79,Sample1Corp,03-0000-0000123-456720/02/19,0,1110,,,,,,,,110,,] ] }; //首先将DOMString转换为ArrayBuffer const utf8Array=new textcoder.encode csv; //将它传递给Encoding,这样我们就可以得到一个字节数组 const sjisArray=Encoding.convertutf8Array,'SJIS','UTF8'; //现在我们可以在不自动编码的情况下生成Blob const blob=new blob[new Uint8Array sjisArray]; const a=document.createElement'a'; a、 下载='Shift JIS.csv'; a、 href=URL.createObjectURL blob; a、 text内容='下载'; document.body.append a; //只是为了检查我们编码是否正确 readAsText blob,“Shift JIS” .then txt=>console.log“读回为Shift JIS:”,txt; readAsText blob,“utf-8” .then txt=>console.log“读回为UTF-8:”,txt; 函数readAsText blob,编码{ 返回新的承诺res,rej=>{ const reader=新文件读取器; reader.onerror=rej; reader.onload=evt=>res reader.result; reader.readAsText blob,编码; } ; }