"Порядок байтов в UTF-16 - порядок байтов компьютера?"
Влияние обратного порядка байтов на вашем компьютере можно посмотреть с точки зрения писателя или читателя файла.
Если вы читаете файл в стандартном формате, то тип машинного чтения не имеет значения. Формат должен быть достаточно четко определен, чтобы независимо от порядка байтов считывающей машины данные могли быть правильно прочитаны.
Это не значит, что формат не может быть гибким. С «UTF-16» (когда в названии формата не используется значение «BE» или «LE») определение позволяет помечать файлы как либо с прямым порядком байтов, либо с прямым порядком байтов. Это делается с помощью так называемой «метки порядка байтов» (BOM) в первых двух байтах файла:
https://en.wikipedia.org/wiki/Byte_order_mark
Существование спецификации дает возможность автору файла. Они могут записать наиболее естественный порядок байтов для буфера в памяти и включить соответствующую спецификацию. Это не обязательно будет наиболее эффективным форматом для других читателей. Но любая программа, заявляющая о поддержке UTF-16, должна справиться с этим в любом случае.
Так что да - порядок байтов компьютера может повлиять на выбор порядка байтов для файла UTF-16 с меткой спецификации. Тем не менее ... программа с прямым порядком байтов полностью способна сохранить файл, пометив его как "UTF-16" и сделать это с прямым порядком байтов. Пока спецификация согласуется с данными, не имеет значения, какая машина ее пишет или читает.
... что, если спецификации нет?
Здесь все становится немного туманно.
С одной стороны, Unicode RFC 2781 и FAQ по Unicode ясны. Они говорят, что файл в формате «UTF-16», который не начинается ни с 0xFF 0xFE
, ни с 0xFE 0xFF
, должен быть интерпретироваться с прямым порядком байтов:
немаркированная форма использует сериализацию байтов с прямым порядком байтов по умолчанию, но может включать в себя метку порядка байтов в начале, чтобы указать фактическую используемую сериализацию байтов.
Тем не менее, чтобы знать, есть ли у вас файл UTF-16-LE, UTF-16-BE или UTF-16 без спецификации ... вам нужны метаданные вне файла, сообщающие вам, какой из трех это. Поскольку не всегда есть место для хранения этих данных, некоторые программы завершались с использованием эвристики.
Рассмотрим что-то вроде этого от Рэймонда Чена (2007):
Вы можете решить, что программы, которые генерируют файлы UTF-16 без спецификации, не работают, но это не значит, что они не существуют. Например,
cmd /u /c dir >results.txt
Это создает файл UTF-16LE без спецификации.
Это допустимый файл UTF-16LE, но где будет храниться мета-метка «UTF-16LE»? Каковы шансы, что кто-то выдаст это, просто назвав его файлом UTF-16?
Эмпирически есть предупреждения по поводу этого термина. На странице для UTF-16 говорится:
Если спецификация отсутствует, RFC 2781 говорит, что следует использовать кодировку с прямым порядком байтов. (На практике, из-за того, что Windows по умолчанию использует прямой порядок байтов, многие приложения аналогичным образом предполагают обратный порядок байтов по умолчанию.)
И unicode.readthedocs.org говорит:
Названия кодировок «UTF-16» и «UTF-32» неточны: в зависимости от контекста, формата или протокола это означает UTF-16 и UTF-32 с маркерами спецификации или UTF-16 и UTF-32 в порядке порядка байтов узла. без спецификации. В Windows «UTF-16» обычно означает UTF-16-LE.
И далее, статья Википедии Byte-Order-Mark говорит:
Пункт D98 соответствия (раздел 3.10) стандарта Unicode гласит: «Схема кодирования UTF-16 может начинаться или не начинаться с спецификации. Однако, когда нет спецификации и в отсутствие протокола более высокого уровня, порядок байтов в схеме кодирования UTF-16 - прямой порядок байтов ".
Вопрос о том, действует ли протокол более высокого уровня, открыт для интерпретации. Например, можно утверждать, что файлы, локальные для компьютера, для которых собственный порядок байтов является прямым порядком байтов, неявно закодированы как UTF-16LE. Таким образом, презумпция прямого порядка байтов широко игнорируется.
С другой стороны, когда те же самые файлы доступны в Интернете, такое предположение невозможно. Поиск 16-битных символов в диапазоне ASCII или просто символа пробела (U + 0020) - это метод определения порядка байтов UTF-16.
Таким образом, несмотря на однозначность стандарта, на практике контекст может иметь значение.
Как указывает @rici, стандарт существует уже некоторое время. Тем не менее, перепроверка файлов, заявленных как "UTF-16", может окупиться. Или даже подумайте, хотите ли вы избежать многих из этих проблем и принять UTF-8 ...
"Следует ли считать UTF-16 вредоносным?"
person
HostileFork says dont trust SE
schedule
11.04.2016