URL-адрес BLOB-объекта в кодировке UTF-16LE

У меня есть эта строка %22%00%41%00%22%00%09%00%22%00%42%00%22%00, которая является эквивалентом UTF-16LE для "A"\t"B". (\t — это символ табуляции.)

Я пытаюсь создать Blob, а затем URL-адрес для него, но вывод не декодируется в правильные сущности.

var blob=new Blob([stringHere],{type:'text/csv;charset=UTF-16LE;'});
var blobUrl=URL.createObjectURL(blob);

Есть ли способ сообщить Blob кодировку строки, чтобы она выглядела правильно при открытии в Excel (в данном конкретном случае)?

Мне нужна UTF-16LE, иначе использование UTF-8 приведет к тому, что Excel не будет правильно анализировать файл .csv.

Спасибо.


person Francisc    schedule 05.12.2014    source источник


Ответы (1)


Похоже, вам нужна utf-16 le bom в файле, чего вы не можете сделать со строкой в ​​​​js, поэтому вам придется использовать массив байтов. См. пример ниже

var stringHere = '%ff%fe%22%00%41%00%22%00%09%00%22%00%42%00%22%00';
var byteArray = [];
stringHere.replace(/([0-9a-f]{2})/gi, function(d){
    byteArray.push(parseInt(d, 16));
});
var blob=new Blob([new Uint8Array(byteArray)],{type:'text/csv;charset=UTF-16LE;'});
var blobUrl=URL.createObjectURL(blob);
person Musa    schedule 05.12.2014
comment
Привет Муса, спасибо. Однако это, похоже, не выводит UTF-16LE. Как вы сказали, мне нужна эта кодировка для Excel, чтобы правильно интерпретировать CSV. Спецификация предназначена для символов, отличных от ASCII. Мне кажется, что type смотрит только на тип MIME и игнорирует указанную кодировку. - person Francisc; 08.12.2014
comment
@Francisc Я пробовал, и у меня это сработало, если вы поместите URL-адрес большого двоичного объекта в браузер, он загрузит файл, просто дайте ему расширение csv и откройте его с помощью Excel. - person Musa; 08.12.2014
comment
И вы действительно видите A и B в разных столбцах? - person Francisc; 08.12.2014
comment
Вы правы, это работает. Я, должно быть, сделал ошибку, когда я впервые тестировал. - person Francisc; 09.12.2014
comment
Хм, а как бы вы, например, преобразовали %22 в 0x22? - person Francisc; 09.12.2014
comment
Потрясающе, спасибо. Немного поиграв с этим, кажется, достаточно просто сделать toString(16) для каждого символа UTF-8. - person Francisc; 09.12.2014
comment
Как вы думаете, может ли использование Uint8Array сделать преобразование из UTF-8 в UTF-16LE ненужным? - person Francisc; 09.12.2014
comment
Я не уверен, что понимаю, я вижу urlencoded utf-16 le не utf-8. Это utf-8, и вы конвертируете его в urlencoded utf-16 le? - person Musa; 09.12.2014
comment
У меня есть строка в кодировке UTF-8. "A"\t"B", который я конвертирую в UTF-16LE (из-за Excel). Написанная вами функция замены кажется дополнительным шагом из-за моего первоначального преобразования, и мне было интересно, смогу ли я использовать UTF-8 и Uint8Array без дополнительного преобразования в UTF-16LE. - person Francisc; 09.12.2014
comment
Может быть, я не знаю. Но следует помнить, что каждая запись в Uint8Array представляет собой байт, а не символ. Символ utf-8 может иметь длину 1-4 байта. Кодировка URL закодировала каждый байт, что упростило преобразование его в типизированный массив. - person Musa; 09.12.2014