Подтвердить что ты не робот

Isnt на больших концах машины UTF-8 по порядку байтов, отличных от маленьких конечных машин? Так почему же UTF-8 не требует спецификации?

UTF-8 может содержать спецификацию. Однако это не имеет никакого значения в отношении сущность байтового потока. UTF-8, всегда имеет тот же порядок байтов.

Если Utf-8 хранит все кодовые точки в одном байте, тогда будет понятно, почему endianness не играет никакой роли, и поэтому BOM не требуется. Но так как коды 128 и выше хранятся с использованием 2, 3 и до 6 байтов, что означает, что их порядок байтов на машинах большого конца отличается от маленьких конечных машин, поэтому как мы можем утверждать, что Utf-8 всегда имеет тот же порядок байтов?

Спасибо

EDIT:

UTF-8 является байт-ориентированным

Я понимаю, что если два байта Utf-8 character C состоит из байтов B1 и B2 (где B1 - первый байт, а B2 - последний байт), то с Utf-8 эти два байта всегда записывается в том же порядке (таким образом, если этот символ записывается в файл на маленькой конечной машине LEM, B1 будет первым и B2 последним. Аналогично, если C записывается в файл на большом конце машина BEM, B1 будет по-прежнему первой и B2 еще последней).

Но что происходит, когда C записывается в файл F на LEM, но мы копируем F в BEM и пытаемся его прочитать? Поскольку BEM автоматически меняет байты (B1 теперь последний и B2 первый байт), как приложение (работает на BEM), читающее F, знает, было ли F создано на BEM и, следовательно, порядок двух байты не были заменены или был отправлен F из LEM, и в этом случае BEM автоматически менял байты?

Надеюсь, что вопрос имел какой-то смысл

ИЗМЕНИТЬ 2:

В ответ на ваше редактирование: big-endian машины не меняют байты, если вы спросите их читать байты за раз.

a) О, так что, хотя символ C имеет длину 2 байта, приложение (находящееся на BEM), считывающее F, будет считывать в память только один байт в то время (таким образом, он сначала будет считываться в память B1 и только тогда B2)

b)

В UTF-8 вы решаете, что делать с байт на основе его старших бит

Предполагая, что файл F имеет два последовательных символа C и C1 (где C состоит из байтов B1 и B2, а C1 имеет байты B3, B4 и B5). Как приложение чтения F знает, какие байты принадлежат друг другу, просто проверив каждый бит старшего разряда (например, как он будет понимать, что B1 и B2 вместе взятые должны представлять символ, а не B1, * B2 * и B3)?

Если вы считаете, что видите что-то другое, отредактируйте свои вопрос и включить

Я не говорю этого. Я просто не понимал, что происходит.

c) Почему UT-16 и Utf-32 также не ориентированы на байты?

4b9b3361

Ответ 1

Порядок байтов отличается от большого числа endian vs little endian для слов/целых чисел больше байта.

например. на большой конечной машине короткое целое число из 2 байтов хранит 8 наиболее значимых бит в первом байте, 8 наименее значимых бит во втором байте. На маленькой конечной машине 8 наиболее значимых бит будут вторым байтом, 8 младшими значащими битами в первом байте.

Итак, если вы записываете содержимое памяти такого короткого int непосредственно в файл/сеть, порядок байтов в коротком int будет отличаться в зависимости от цели.

UTF-8 ориентирован на байты, поэтому нет проблемы с контентом. первый байт всегда является первым байтом, второй байт всегда является вторым байтом и т.д., независимо от endianess.

Ответ 2

Чтобы ответить на c): UTF-16 и UTF-32 представляют символы как 16-битные или 32-битные слова, поэтому они не байт-ориентированы.

Для UTF-8 наименьшая единица является байтом, поэтому она байт-ориентирована. Алорифм читает или записывает один байт за раз. Байт представлен одинаково на всех машинах.

Для UTF-16 наименьшая единица - это 16-битное слово, а для UTF-32 наименьшая единица - это 32-битное слово. Алгоритм считывает или записывает по одному слову за раз (2 байта или 4 байта). Порядок байтов в каждом слове отличается на машинах большого и малого порядков.