修复非相干编码的文本文件的编码

时间:2012-05-21 14:44:13

标签: linux perl character-encoding iconv bibtex

我有一个很长的文本文件,在后续的文本块(iso或utf-8)中使用明显不同的编码。这是使用>> file.bib附加文本并从不同来源(网页)复制和粘贴的结果。

原则上可以区分块,因为它们是bibtex条目

 @article{key, author={lastname, firstname}, ...}

我想将它转换为连贯的utf-8文件,因为它似乎崩溃了我的bibtex查看器(kbibtex)。我知道我可以使用iconv来转换整个文件的编码,但我想知道是否有办法修复我的文件而不会破坏某些条目。

2 个答案:

答案 0 :(得分:3)

如果您可以为每一行假设统一编码,并且您知道备用编码:

#!/usr/bin/perl
use Encode;
while(<>) {
      my $line;
      eval {
        $line=Encode::decode_utf8( $_ );
      }
      if ($@) $line=Encode::decode( 'iso-8859-1', $_ ); #not UTF-8
      # Now $line is UNICODE.Do something to it

} 

如果行是混合编码,您仍然可以通过单词执行相同操作,但您仍然知道备用编码是什么。如果不知道备用编码,或者你有多个,你需要使用一些编码猜测库,这可能会猜错。

答案 1 :(得分:3)

我使用vim,但我想它可以在任何编辑器中完成。

  • 选择(shift + v)要更改编码的文本块。

  • 输入:!enca -L lang - (用您的语言替换'lang',我使用'enca -L cs'。然后enca实用程序会告诉您所选块的最可能编码)

  • 按你(这样就撤消了文字中出现的enca答案)

  • 再次选择该块,这次运行:!iconv -f determined_encoding -t UTF-8

请注意,vim自动展开按下:to:\&lt;,&gt;当你处于可视模式时,这正是你想要在文本块上运行程序的。