Разве на старших машинах с порядком байтов порядок байтов в UTF-8 не отличается от порядкового порядка байтов?Так почему же тогда UTF-8 не требует спецификации? - PullRequest
31 голосов
/ 30 сентября 2010

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

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

Спасибо

РЕДАКТИРОВАТЬ:

UTF-8 ориентирован на байты

Я понимаю, что если два байта UTF-8 символ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:

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

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 )?

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

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

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

Ответы [ 2 ]

32 голосов
/ 30 сентября 2010

Порядок байтов различен на машинах с прямым порядком байтов по сравнению с машинами с прямым порядком байтов для слов / целых чисел больше байта.

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

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

10 голосов
/ 18 апреля 2016

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...