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