Задача: сгенерировать csv-файл в кодировке UTF-8 с BOM-флагом и положить его в контекстную переменную типа Файл.
На просторах github был найден и адаптирован следующий скрипт:
Код:
async function createCSVFile(): Promise<void> {
let test_string:string
test_string = 'Заголовок первого поля;'
// Если нужен Unix-стиль переносов - используем просто \n
test_string += 'Значение первого поля\r\n'
try{
Context.data.file = await Context.fields.file.create('file.csv',toUTF8(test_string))
}
catch(e){
Context.data.debug = e.message
}
}
function toUTF8(str:string):ArrayBuffer {
let utf8:number[] = []
// BOM-флаг, если не требуется - можно закомментировать
utf8.push(0xef, 0xbb, 0xbf)
for (var i=0; i < str.length; i++) {
let charcode = str.charCodeAt(i)
if (charcode < 0x80) utf8.push(charcode)
else if (charcode < 0x800) {
utf8.push(0xc0 | (charcode >> 6), 0x80 | (charcode & 0x3f))
}
else if (charcode < 0xd800 || charcode >= 0xe000) {
utf8.push(0xe0 | (charcode >> 12),
0x80 | ((charcode>>6) & 0x3f),
0x80 | (charcode & 0x3f));
}
// surrogate pair
else {
i++;
charcode = ((charcode&0x3ff)<<10)|(str.charCodeAt(i)&0x3ff)
utf8.push(0xf0 | (charcode >>18),
0x80 | ((charcode>>12) & 0x3f),
0x80 | ((charcode>>6) & 0x3f),
0x80 | (charcode & 0x3f))
}
}
return new Uint16Array(utf8)
}