Почему шестнадцатеричный дамп моего текстового файла Unicode отличается от последовательности байтов, которую я ввел вручную?

Почему следующее приводит к такой другой последовательности байтов в шестнадцатеричном дампе?

$ echo -e "\u0f67\u0fb9\u0fa8\u0fb3\u0fba\u0fbc\u0fbb\u0f83\u0f0b" > uni
$ hexdump uni
0000000 bde0 e0a7 b9be bee0 e0a8 b3be bee0 e0ba
0000010 bcbe bee0 e0bb 83be bce0 0a8b
000001c

$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE=C
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

Локаль правильно установлена ​​​​на: en_US.UTF-8, и фактический вывод Unicode правильный: ཧྐྵྨླྺྼྻྃ་


person jollyroger    schedule 13.12.2013    source источник
comment
Мое первое предположение было для UTF-8. U+0F67 — это 0xE0 0xBD 0xA7 в кодировке UTF-8. Но этот вывод выглядит как испорченный вариант UTF-8. Что выводит $ locale?   -  person R. Martinho Fernandes    schedule 13.12.2013
comment
Нет, это определенно версия с кодировкой utf-8. Порядок байтов корявый, отображается как будто это utf-16le.   -  person Hans Passant    schedule 13.12.2013


Ответы (1)


Мое заблуждение связано с тем, что я считаю, что символы, которые я повторил, были utf8, хотя на самом деле они utf16. При поиске первого символа utf8 отображается как

 e0 bd a7

Который должен быть в обратном порядке. Таким образом, чтобы изменить порядок следования байтов, можно запустить hexdump с параметром -C.

person jollyroger    schedule 13.12.2013