2011-10-07 19 views
7

我具有被unix下描述为一个文件:的iconv unicode的未知的输入格式

$file xxx.csv 
xxx.csv: UTF-8 Unicode text, with very long lines 

查看它在less/vi将呈现一些特殊字符(SSA°...)不可读(├╝); Windows也不会显示它;直接将它导入数据库只会将特殊字符更改为其他特殊字符(+ä,+ñ,...)。

我想现在将它转换为带有iconv的“默认可读”编码。 当我尝试它使用UNICODE作为输入和UTF-8的iconv

$iconv -f UTF-8 -t ISO-8859-1 xxx.csv > yyy.csv 
iconv: illegal input sequence at position 1234 

转换为输出将返回相同的消息

我猜在文件中另一种格式有所编码,我不知道如何找出哪种格式,以便将其转换为“普遍”可读的格式...

+0

尝试在文本编辑器中打开它,使您可以更改打开文件的编码。浏览器最糟糕的情况也会发生。然后玩弄可用的编码并查看正确显示字符的内容。 – deceze

+0

我试着用记事本++,但它是680MB和记事本++告诉我这是太大.. –

+0

该文件显然不是UTF-8,即使'文件'猜测它。你能否以十六进制形式向我们展示从偏移量1234开始的八个字节? –

回答

4

问题是Windows无法将文件解释为UTF-8本身。它把它读成ASCI然后变成2字解释澶(ASCII 195 164)

试图将其转换,我发现我工作的解决方案:

iconv -f UTF-8 -t WINDOWS-1252//TRANSLIT --output=outfile.csv inputfile.csv 

现在我可以查看特殊字符正确编辑

对于SQLServer的保持兼容,转换UTF-8 UTF-16将工作更好...只是文件大小的增长颇有几分

1

如果你不知道你打交道的文件类型然后你可以找到它如下,

file file_name 

上面的命令会给你文件格式。然后iconv可以相应地使用。 例如,如果文件格式为UTF-16并且要将其转换为UTF-8则可以使用以下内容。

iconv -f UTF-16 -t UTF-8 file_name >output_file_name 

希望这可以增加洞察你正在寻找的东西。

8

如果您的UTF-8文本只包含可以用ISO-8859-1表示的字符,则只能从UTF-8转换为ISO-8859-1。如果不是这种情况,你应该指定这些字符需要发生什么,或者忽略(// IGNORE)或者近似(// TRANSLIT)它们。请尝试以下两种方法之一:

iconv -f UTF-8 -t ISO-8859-1//IGNORE --output=outfile.csv inputfile.csv 
iconv -f UTF-8 -t ISO-8859-1//TRANSLIT --output=outfile.csv inputfile.csv 

在大多数情况下,我估计近似是最好的解决方案,例如映射重音字符到他们没有出现的对应物,欧元符号到欧元等......