Что подразумевается под BOM? Я пробовал читать эту статью, но не очень понял, что это значит.
Я читал, что некоторые текстовые редакторы помещают спецификацию перед началом файла. Для чего он предназначен?
Что подразумевается под BOM? Я пробовал читать эту статью, но не очень понял, что это значит.
Я читал, что некоторые текстовые редакторы помещают спецификацию перед началом файла. Для чего он предназначен?
BOM
означает Byte Order Mark
. Короче говоря, BOM
— это маркер в начале файла, указывающий, должен ли быть первым старший байт или младший значащий байт.
Это вызывает много проблем, особенно с UTF8. UTF8 не использует спецификацию, но есть вариант под названием UTF8Y (или UTF со спецификацией), который включает несколько дополнительных символов в начале файла.
Отправка файла UTF8Y с типом кодировки UTF8 приводит к отправке нескольких дополнительных байтов в начале файла и может вызвать всевозможные трудно отслеживаемые проблемы, включая неправильный анализ DOCTYPE в одном файле IE или JSON. не поддается расшифровке.
Несколько раз он укусил меня за файлы от других людей, когда я не внимательно проверял тип файла.
Моя рекомендация: помните, что он существует, никогда не используйте его целенаправленно.
jEdit
, либо Notepad++
). Согласно этой диаграмме, UTF8 не имеет спецификации. ER, позже это указывает на то, что спецификация является необязательной, но не влияет на фактический порядок байтов. Похоже, что UTF8Y — это официальное имя, чтобы отделить его от UTF8 without BOM.
.
- person Jeremy J Starcher; 12.10.2012
UTF-8 without BOM
, но некоторые дополнительные символы включен в файл ! Что имеется в виду?
- person Y.E.P; 14.10.2012
Метка порядка байтов позволяет программе определить, как читать данные Unicode. С вашей вики-страницы:
Поскольку Unicode может быть закодирован как 16-битные или 32-битные целые числа, компьютер, получающий эти кодировки из произвольных источников, должен знать, в каком порядке байтов закодированы целые числа.
Для UTF-8 нет никакой двусмысленности в отношении того, как читать байты, поэтому спецификация часто опускается. Для UTF-16 и UTF-32 необходимо знать, как интерпретировать байты, и для этой цели может служить спецификация.
Обратите внимание, что у Java есть проблемы с чтением спецификаций UTF-8, и вы должны вручную обрабатывать эти символы, если они есть (см. Чтение UTF-8 - BOM marker для некоторых ссылок на соответствующие ошибки Sun).
Я, вероятно, собираюсь рассказать о том, что вы уже знаете, но вот...
Чтобы понять назначение спецификации, вам нужно понять (по крайней мере, концептуально), что такое порядок следования байтов.
Если вы имеете дело с одним байтом (8 двоичных битов), он упорядочен по возрастанию значимости справа налево (точно так же, как при чтении обычного десятичного числа, например «19»). Это достаточно просто, если вы можете содержать число в одном байте. Как только вы доберетесь до двух байтов, вам нужно знать, какой из двух байтов является более значимым, то есть с прямым порядком байтов или с прямым порядком байтов. Big endian означает, что самый младший адрес памяти (или самый левый, если продолжить аналогию с записью) содержит более высокие значения — это продолжает тенденцию западных десятичных чисел. Исторически сложилось так, что Intel использует обратный порядок байтов, а Motorola — обратный порядок байтов. (Я не смотрел в последнее время, это может быть по-другому.)
Спецификация — это просто маркер, указывающий, как интерпретировать порядок байтов данных.
Сегодня это просто означает: «Этот файл находится в кодировке UTF-8». Или «Этот файл находится в кодировке UTF-16». Хотя в обоих случаях это один и тот же символ спецификации, способ кодирования спецификации подразумевает, как будут кодироваться все остальные.
Если вы не знаете, что такое первый символ, вы не можете надежно вывести кодировку документа из него — вы должны определить его откуда-то еще или более или менее угадать.
Приложение после голосования:
Исторически сложилось так, что у BOM было другое назначение — пробельный символ нулевой ширины (то есть настолько невидимый, насколько может быть символ Unicode, но все же символ). Многие широко используемые программные библиотеки, такие как .NET и Java, автоматически или неявно добавляют спецификацию в записанные файлы или даже массивы байтов, что часто обманывает людей, заставляя их думать, что они не используют спецификацию, когда они это делают. Это часто имеет неприятные последствия, когда стек таких библиотек записывает несколько спецификаций в начало одного и того же файла, потому что тогда ваш файл начинается с недопустимого или нежелательного символа, неразрывного пробела нулевой ширины; и вы даже не видите его при осмотре!
Неудивительно, что метод BOM подходит не всем.
UTF-16LE
или UTF-16BE
;)
- person Peter Lawrey; 12.10.2012
java
. - person acegs   schedule 06.04.2019