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