3

Когда я пытаюсь использовать 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 ответа3

3

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

^@ - это null символ.

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

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

1

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

0

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

:edit ++enc=ucs-2

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

$ vim ++enc=ucs-2 filename

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .