Добавление спецификации 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.