Могли ли UTF-16 и UTF-32 быть определены без порядка байтов? - PullRequest
0 голосов
/ 25 марта 2020

Теперь я знаком с кодировкой символов Unicode и UTF. Я также знаю о порядке байтов: архитектура имеет либо младший, либо большой порядок байтов, и они полезны из-за производительности на низкоуровневом оборудовании. Но зачем нам нужен endian в текстовых файлах? Символы в файле хранятся слева направо, даже если мы используем разные порядковые номера. Так что, по моему мнению, правильный порядковый номер является в этом случае большим. Я go далее: мы не должны даже говорить о порядке байтов при сохранении символов в текстовый файл. Итак, мой вопрос: почему не существует только одного UTF-16 и одного UTF-32? Кто-нибудь может дать мне пример, где необходимо иметь и UTF16LE, и UTF16BE / UTF32LE, и UTF32BE?

1 Ответ

1 голос
/ 25 марта 2020

Ради аргумента, давайте рассмотрим это понятие. Вы определяете действительный UTF-16 как big-endian. Хорошо, хорошо.

Я пишу код на машине с прямым порядком байтов. Мне все еще нужно уметь читать, понимать и манипулировать данными UTF-16. Поскольку я использую процессор с прямым порядком байтов (использующий C ++ в качестве примера языка), char16_t является прямым порядком байтов. Если бы я bit_cast перешел в массив из двух символов, первый байт был бы наименее значимым байтом.

Таким образом, в то время как ваш формат обмена определяет в качестве единственно допустимого формата передачи значение с прямым порядком байтов, в моем машина, она не полезна UTF-16 для меня, пока она не будет преобразована в little-endian, где моя машина может действительно понимать значения, хранящиеся в ней. Поэтому, когда я читаю символьные данные из действительного потока UTF-16 (используя ваше определение достоверности), я должен поменять их байтами, прежде чем я смогу разобраться в данных.

Теперь, скажем, я хочу отправить UTF-16 через некоторый механизм передачи (файлы, inte rnet, et c) в другую программу / машину. Но по какой-то причине я знаю , что процесс получения определенно будет выполняться на машине с прямым порядком байтов.

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

Практическая реальность вопроса такова: я не собираюсь этого делать. Это делает мне абсолютно нулевую выгоду. И самое главное ... вы не можете заставить меня сделать это .

Реальность такова: до тех пор, пока маленькие порядковые машины существуют и довольно широко распространены, будут некоторые практическая утилита для хранения / отправки / получения данных в собственном формате хранения UTF-16LE по крайней мере для некоторых приложений. И до тех пор, пока есть практическая полезность, работающие программисты будут делать это . Вы можете сказать им, что они делают передачу UTF-16 не так, как вам хочется, но они будут продолжать это делать.

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

Обратите внимание, что этот вопрос отличается от вопроса более жесткого формата данных. Существуют двоичные форматы данных, которые явно имеют порядок байтов или порядок байтов. Но, как правило, такие форматы имеют тенденцию быть строго определенными форматами, которые должны соответствовать строгому набору других критериев. Часто будет приложение для тестирования соответствия, которое вы можете использовать, чтобы убедиться, что ваша программа генерирует файл правильно, и запись его в неправильном порядке байтов сразу же будет считаться «неправильной».

Обычный текст просто не не так работать. Никто не проталкивает свои текстовые файлы через какой-либо распознаватель, если только сам текст не должен соответствовать указанному формату c (с этого момента это уже не «простой текст»). Например, XML может потребовать, чтобы текстовые файлы в кодировке UTF-16 соответствовали указанному c порядку байтов. Но простой текст слишком прост c для этого; слишком много приложений, которые просто хотят выгрузить строку UTF-16 в файл, чтобы это было реалистично c.

...