当我尝试在 MapReduce(使用 Java)中使用 Context.write(k,v) 将数据写入文件时,我在文件中发现以下内容(用 vi 打开,有:set 列表):
^@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
? 如果是,那么 vi 中的 '$' 和 '^M' 有什么区别?
答案1
$
是行尾,如选项:set list
的默认值所示listchar
。^I
是制表符。
^@
是null
角色。
由于某些奇怪的原因,文件中每个有意义的字符前面都会加上一个null
除数字和(可能)空格以外的字符。
这不是 Vi(m) 的问题:请检查该方法的文档,看看是否有办法在不带这些null
s 的情况下输出数据。
答案2
您打开的文件是 UTF-16 或 UCS-2 编码的,这是 Java 中的标准。vi
(如实际的vi
,而不是vim
符号链接到的vi
)只能处理 ASCII(或 ISO-8859-1?)文本。使用vim
,或将文件转换为 ASCII(例如iconv -f utf-16 -t ascii <input> <output>
)。
答案3
如果你的命令是由 Vim 执行的vi
,你可以使用以下命令重新加载文件
:edit ++enc=ucs-2
或者直接指定编码
$ vim ++enc=ucs-2 filename
或者,如果您需要频繁打开这些文件,请ucs-2
将该选项添加到'fileencodings'
前面,例如在您的~/.vimrc
.