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

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

используя new Blob(['xEFxBBxBF' + content]) доходность '"my data"', конечно.

не 'uBBEFx22BF' работа (с 'x22' == '"' быть следующим персонажем в content).

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

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

3 ответов


добавить \ufeff в строку. См.http://msdn.microsoft.com/en-us/library/ie/2yfce773 (v=против 94).aspx

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

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

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


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

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

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

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

видимо, узел.JS использует \ufeff для обозначения любого количества кодировок. Он принимает маркер \ufeff и преобразует его в правильный знак порядка байтов на основе параметра 3rd options файла записи. 3-й параметр, который вы передаете в строке кодирования. Узел.Яш принимает эту строку кодировки и преобразование фиксированная байтовая кодировка \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 в качестве метки-заполнителя в строке, которая заменяется во время записи.


у меня была та же проблема и это решение я придумал:

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.