cat
имеет -v
опцию, которая преобразует непечатаемые символы в их обозначение с помощью курсора (что полезно, если мы не хотим, чтобы терминал буквально интерпретировал управляющие символы в cat
выводе).
Но, как я понимаю, обозначение каретки применяется только к непечатаемым символам в алфавите ASCII. Так что насчет непечатаемых символов в UTF, которые не попадают в ASCII (например,https://www.compart.com/en/unicode/category/Cc)? Какая нотация будет cat -v
использоваться для их отображения?
решение1
Мы можем сгенерировать файл, содержащий первые 256 символов Unicode в кодировке UTF-8, с помощью:
python3 -c 'for x in range(0,255): print(chr(x), end="")' > unicode-file
Сюда входят элементы управления, не входящие в ASCII (C1), в дополнении к Latin-1, а также множество печатных символов.
Теперь мы можем cat -v
это сделать:
^@^A^B^C^D^E^F^G^H
^K^L^M^N^O^P^Q^R^S^T^U^V^W^X^Y^Z^[^\^]^^^_ !"#$%&'()*+,-./0123456789:;
<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~^?
M-BM-^@M-BM-^AM-BM-^BM-BM-^CM-BM-^DM-BM-^EM-BM-^FM-BM-^GM-BM-^HM-BM-^I
M-BM-^JM-BM-^KM-BM-^LM-BM-^MM-BM-^NM-BM-^OM-BM-^PM-BM-^QM-BM-^RM-BM-^S
M-BM-^TM-BM-^UM-BM-^VM-BM-^WM-BM-^XM-BM-^YM-BM-^ZM-BM-^[M-BM-^\M-BM-^]
M-BM-^^M-BM-^_M-BM- M-BM-!M-BM-"M-BM-#M-BM-$M-BM-%M-BM-&M-BM-'M-BM-(M-B
M-)M-BM-*M-BM-+M-BM-,M-BM--M-BM-.M-BM-/M-BM-0M-BM-1M-BM-2M-BM-3M-BM-4M-B
M-5M-BM-6M-BM-7M-BM-8M-BM-9M-BM-:M-BM-;M-BM-<M-BM-=M-BM->M-BM-?M-CM-^@
M-CM-^AM-CM-^BM-CM-^CM-CM-^DM-CM-^EM-CM-^FM-CM-^GM-CM-^HM-CM-^IM-CM-^J
M-CM-^KM-CM-^LM-CM-^MM-CM-^NM-CM-^OM-CM-^PM-CM-^QM-CM-^RM-CM-^SM-CM-^T
M-CM-^UM-CM-^VM-CM-^WM-CM-^XM-CM-^YM-CM-^ZM-CM-^[M-CM-^\M-CM-^]M-CM-^^
M-CM-^_M-CM- M-CM-!M-CM-"M-CM-#M-CM-$M-CM-%M-CM-&M-CM-'M-CM-(M-CM-)M-C
M-*M-CM-+M-CM-,M-CM--M-CM-.M-CM-/M-CM-0M-CM-1M-CM-2M-CM-3M-CM-4M-CM-5M-C
M-6M-CM-7M-CM-8M-CM-9M-CM-:M-CM-;M-CM-<M-CM-=M-CM->
(Я вручную обернул это так, чтобы было читабельно)
Вы можете видеть, что он представляет U+0080 в начале четвертой строки, что соответствует UTF-8 C2 80
, так как M-BM-^@
. M-B
представляет байт C2: B равен 0x42, поэтому M-
представляет установку старшего бита (т. е. добавление 0x80). M-^@
делает то же самое для нулевого байта (meta-ctrl-@) — обозначения M-x
и ^x
объединены вместе.
То же самое произойдет для всех не-ASCII кодовых точек, которые будут полностью состоять из верхних байтов в UTF-8 или всех байтов 128-255 в любой другой кодировке. Различные cat
реализации могут иметь свое собственное поведение, как-v
не являетсястандартная cat
опция, но и GNU cat, и обычные версии BSD ведут себя именно так.