Добавление спецификации UTF-8 в строку/Blob

Мне нужно добавить знак байта UTF-8 в сгенерированные текстовые данные на стороне клиента. Как это сделать?

Используя new Blob(['\xEF\xBB\xBF' + content]), вы получите '"my data"', конечно.

Ни работало '\uBBEF\x22BF''\x22' == '"' - следующий символ в content).

Можно ли добавить спецификацию UTF-8 в JavaScript к сгенерированному тексту?

Да, мне действительно нужна спецификация UTF-8 в этом случае.

Ответ 1

Подготовьте \ufeff к строке. См. http://msdn.microsoft.com/en-us/library/ie/2yfce773(v=vs.94).aspx

Смотрите обсуждение @jeff-fischer и @casey для получения подробной информации о UTF-8 и UTF-16 и спецификации. Что на самом деле делает вышеприведенную работу, так это то, что строка \ufeff всегда используется для представления спецификации, независимо от используемого UTF-8 или UTF-16.

Подробнее см. стр. 36 в Unicode Standard 5.0, глава 2. Цитата с этой страницы

Введенный в конец таблицы порядок ввода для UTF-8 в таблице 2-4 отмечен как N/A, поскольку Кодовые единицы UTF-8 имеют размер 8 бит, а обычные порядковый номер для более крупных блоков кода не применяется. Сериализованный порядок байтов не должны отклоняться от порядка, определенного UTF-8 кодирование. Использование спецификации не требуется и не рекомендуется для UTF-8, но могут встречаться в контекстах, где данные UTF-8 преобразованные из других форм кодирования, которые используют спецификацию или где спецификация используется как подпись UTF-8.

Ответ 2

Я редактирую свой оригинальный ответ. Вышеупомянутый ответ действительно требует разработки, поскольку это сложное решение Node.js.

Короткий ответ: да, этот код работает.

Длинный ответ: нет, FEFF не является байтом для utf-8. По-видимому, node взял какой-то ярлык для написания кодировок в файлах. FEFF - это кодировка Little Endian UTF16, как можно видеть в статье описания байтового кода байта, а также может быть просмотрена в двоичном текстовом редакторе после написания файла. Я подтвердил, что это так.

http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding

По-видимому, Node.JS использует \ufeff для обозначения любого количества кодировок. Он берет маркер \ufeff и преобразует его в правильный знак байтового байта на основе третьего параметра параметра writeFile. Третий параметр, который вы передаете в строке кодирования. Node.JS берет эту строку кодировки и преобразует кодировку с фиксированным байтом \ufeff в любую из фактических отметок порядка байтов кодирования.

UTF-8 Пример:

fs.writeFile(someFilename, '\ufeff' + html, { encoding: 'utf8' }, function(err) {
   /* The actual byte order mark written to the file is EF BB BF */
}

UTF-16 Маленький конечный пример:

fs.writeFile(someFilename, '\ufeff' + html, { encoding: 'utf16le' }, function(err) {
   /* The actual byte order mark written to the file is FF FE */
}

Итак, как вы можете видеть, \ufeff - это просто маркер, указывающий любое количество результирующих кодировок. Фактическая кодировка, которая попадает в файл, напрямую зависит от указанной опции кодирования. Маркер, используемый в строке, действительно не имеет отношения к тому, что записывается в файл.

Я подозреваю, что причина в том, что они решили не записывать байтовые байты, а 3 байтовая метка для UTF-8 нелегко закодирована в строку javascript, которая должна быть записана на диск. Таким образом, они использовали спецификацию UTF16LE в качестве метки метки в строке, которая заменяется во время записи.

Ответ 3

У меня была такая же проблема, и это решение, с которым я столкнулся:

var blob = new Blob([
                    new Uint8Array([0xEF, 0xBB, 0xBF]), // UTF-8 BOM
                    "Text",
                    ... // Remaining data
                    ],
                    { type: "text/plain;charset=utf-8" });

Использование Uint8Array запрещает браузеру преобразовывать эти байты в строку (проверен на Chrome и Firefox).

Вы должны заменить text/plain на ваш желаемый тип MIME.