установить кодировку csv при загрузке файла - PullRequest
0 голосов
/ 17 марта 2020

Я использую реагирование, Paparse и encoding-japanese

С Paparse я могу загрузить CSV и декодировать его из Shift- JS. но противоположная операция не поддерживается библиотекой.

Я добавил кодировку japanese, чтобы преобразовать строку в 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-файл, когда я открываю его в блокноте, все еще находится в UTF8 с спецификацией.

Я хочу, чтобы он был в смене - js.

Как мне этого добиться?

1 Ответ

3 голосов
/ 19 марта 2020

Ваша Encoding библиотека в настоящее время возвращает DOMString, потому что вы передали такую ​​DOMString в качестве ввода.
Это означает, что ваш Blob конструктор преобразует эту DOMString в UTF-8, и это то, что вы будете иметь в Ваш файл: версия UTF-8 представления в кодировке Shift-JIS в формате UTF-16.

Можно сказать, что это не то, что вам нужно.

Быстрый просмотр документов этой библиотеки Похоже, что лучше всего было бы передать версию ArrayBuffer вашего текста для кодирования, чтобы он возвращал вам массив значений байтов (например, Uint8Array, за исключением того, что по каким-либо причинам они используют обычный массив).

Затем из этого массива байтов вы сможете сгенерировать новый массив ArrayBuffer, который вы сможете передать своему BLOB-объекту без преобразования его обратно в UTF-8.

const csv = Papa.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","","","",""]
    ]
});
// First convert our DOMString to an ArrayBuffer
const utf8Array = new TextEncoder().encode( csv );
// pass it to Encoding so we get back an Array of bytes
const sjisArray = Encoding.convert(utf8Array, 'SJIS', 'UTF8');
// now we can make our Blob without auto encoding
const blob = new Blob( [ new Uint8Array( sjisArray ) ] );

const a = document.createElement('a');
a.download = 'Shift-JIS.csv';
a.href = URL.createObjectURL( blob );
a.textContent = 'download';
document.body.append( a );
// just to check we encoded it correctly
readAsText( blob, 'Shift-JIS' )
  .then( txt => console.log( 'read back as Shift-JIS:', txt ) );
readAsText( blob, 'utf-8' )
  .then( txt => console.log( 'read back as UTF-8:', txt ) );
  
function readAsText( blob, encoding ) {
  return new Promise( (res, rej) => {
    const reader = new FileReader();
    reader.onerror = rej;
    reader.onload = (evt) => res( reader.result );
    reader.readAsText( blob, encoding );
  } );
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/PapaParse/5.1.0/papaparse.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/encoding-japanese/1.0.30/encoding.min.js"></script>
...