5

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

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

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

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

4

2 回答 2

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

} 

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

于 2012-05-21T16:28:34.050 回答
3

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

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

  • type :!enca -L lang -(用你的语言替换'lang',我使用'enca -L cs'。enca实用程序应该告诉你所选块的最可能编码)

  • 按 u(这样您就可以撤消文本中出现的 enca 的答案)

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

请注意,当您处于可视模式时,vim 会自动将按下的 : 扩展为 :\<,>,这正是您在文本块上运行程序所需要的。

于 2012-05-21T20:00:02.087 回答