Что означает ^@, ^I и $ в vi?

Когда я пытаюсь использовать Context.write(k,v) в MapReduce(используя Java) для записи данных в файл, я нахожу следующее содержимое в файле (открывается с помощью vi, есть:set list):

^@R^@u^@n^@^I1$
^@a^@c^@c^@e^@s^@s^@^I1$
^@d^@e^@f^@a^@u^@l^@t^@ 2$
^@o^@u^@t^@^I2$
^@p^@r^@o^@j^@e^@c^@t^@^I1$
^@t^@a^@s^@k^@^I1$
^@w^@i^@n^@d^@o^@w^@s^@^I1$
^@y^@o^@u^@r^@^I1$

Что значит ^@^I а также $? Есть ли ^I имею в виду \t? я знаю это $ означает конец строки, но означает ли это клавишу ввода, так же, как \n? Если так, в чем разница между '$' и '^M' в vi?

3 ответа

Решение

$ конец строки, отображаемый :set list со значением по умолчанию listchar вариант. ^I является символом табуляции.

^@ это null персонаж.

По какой-то странной причине каждый значащий символ в вашем файле начинается с null символ кроме цифр и (возможно) пробелов.

Это не проблема Vi(m): посмотрите документацию этого метода, чтобы узнать, есть ли способ вывести ваши данные без них. nulls.

Файл, который вы открыли, имеет кодировку UTF-16 или UCS-2, что является стандартом в Java. vi (как в реале viне vim символическая ссылка на vi) может обрабатывать только текст ASCII (или ISO-8859-1?). использование vimили преобразовать файл в ASCII (например, iconv -f utf-16 -t ascii <input> <output>).

Если это Вим за тобой vi команда, вы можете перезагрузить файл с

:edit ++enc=ucs-2

или напрямую указать кодировку

$ vim ++enc=ucs-2 filename

или, если вам нужно часто открывать эти файлы, ucs-2 к 'fileencodings' вариант, например, в вашем ~/.vimrc,

Другие вопросы по тегам