Почему xxd не отображает метку порядка байтов?

Почему xxd не отображает метку порядка байтов?

У меня есть класс Java, который компилятор отказывается компилировать из-за \ufeffв начале файла. Я могу увидеть тот факт, что BOM присутствует vim -b file.java, по , но ни xxd, ни hexdumpпоказать два байта. Есть ли способ заставить их это сделать?

решение1

Символ U+FEFF кодируется в UTF-8 тремя байтами: ef bb bf.

xxdили hexdumpпоказывает вам содержимое байта, то есть эти 3 байта, а не символ, который эти 3 байта кодируют vim -b.

Чтобы удалить BOM (который не имеет смысла в UTF-8) и исправить другие особенности текстовых файлов Microsoft (которые, вероятно, являются источником вашей проблемы), вы можете использовать dos2unix.

$ printf '\ufefffoobar\r\n' | hd
00000000  ef bb bf 66 6f 6f 62 61  72 0d 0a                 |...foobar..|
0000000b
$ printf '\ufefffoobar\r\n' | uconv -x name
\N{ZERO WIDTH NO-BREAK SPACE}\N{LATIN SMALL LETTER F}\N{LATIN SMALL LETTER O}\N{LATIN SMALL LETTER O}\N{LATIN SMALL LETTER B}\N{LATIN SMALL LETTER A}\N{LATIN SMALL LETTER R}\N{<control-000D>}\N{<control-000A>}
$ printf '\ufefffoobar\r\n' | uconv -x hex
\uFEFF\u0066\u006F\u006F\u0062\u0061\u0072\u000D\u000A
$ printf '\ufefffoobar\r\n' | dos2unix | hd
00000000  66 6f 6f 62 61 72 0a                              |foobar.|
00000007

Связанный контент