为什么iconv命令输出到同一文件会被截断?

时间:2013-07-26 03:14:36

标签: c linux bash iconv

现在我有一些需要转换为utf-8编码的euc-jp编码文件。 所以我在bash中使用iconv命令:

iconv foo.c -f euc-jp -t utf-8 -o foo.c

但是它出现了一个问题:

  

/ usr / bin / iconv:位置30211的非法输入序列

并将文件截断为一定大小(32~33KB)。

但令人困惑的是,如果我使用

iconv foo.c -f euc-jp -t utf-8               # output to STDOUT
iconv foo.c -f euc-jp -t utf-8 -o foo.c.utf8 # output to a new file

效果非常好。

所以我想这可能与BUFFER有关,有人可以向我解释一下吗?

4 个答案:

答案 0 :(得分:3)

在没有同步的情况下读取和写入同一个文件?不,这不是一个好主意。该文件将搞砸。

为了不损害数据并且不产生垃圾,请尝试:

cp foo.c temp.input; iconv temp.input -f euc-jp -t utf-8 -o foo.c;rm temp.input;

答案 1 :(得分:2)

写入您正在阅读的文件会导致问题吗?真是个惊喜!

查看iconv是否有一些命令行可以内联工作,或者写入tmp输出文件并在完成后复制回原始文件。

答案 2 :(得分:1)

使用相同的文件进行输入和输出并不是一个好主意。您无法确定操作例程(在本例中为iconv)如何使用这些文件。

答案 3 :(得分:1)

它正在覆盖它也试图读取的文件。如果转换后的表单比原始表单长,输出将赶上输入,然后它将尝试转换它已经转换的内容。

令人惊讶的是它完全有效。大多数程序在写入之前截断它们的输出文件,因此没有任何东西可以从中读取。