2012-05-21 43 views
5

我有一個長文本文件,它在隨後的文本塊(iso或utf-8)中使用明顯不同的編碼。這是使用>> file.bib附加文本並從不同來源(網頁)複製和粘貼的結果。修復非統一編碼文本文件的編碼

塊可以爲他們bibtex

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

我想因爲它似乎崩潰我的中文提供瀏覽器(kbibtex)將它轉換成一個連貫的UTF-8文件中的原則加以區分。我知道我可以使用iconv轉換整個文件的編碼,但我想知道是否有辦法在不損壞某些條目的情況下修復我的文件。

+4

提供更多的細節,請參見[在Perl中將混合編碼文件轉換爲UTF8的問題](http://stackoverflow.com/questions/6897982/questions-about-converting-a-mixed-encoding-file- to-utf8-in-perl)進行比較,信息是有用的。 – daxim

+0

您應該首先將文件分割成單獨的HTML文檔。然後,您可以檢查每個文檔的BOM和HEAD元素中的字符集。 – ikegami

回答

3

如果你可以假設每行統一的編碼,你知道備用編碼:

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

} 

您仍然可以通過的話做同樣的,如果線混合編碼,但你還是知道什麼是備用編碼。如果不知道替代編碼,或者如果您有多個編碼,則需要使用一些編碼猜測庫,這很可能是猜錯。

+2

它介於UTF-8和ISO-8859-1之間,請使用[Encoding :: FixLatin](http://search.cpan.org/perldoc?Encoding:FixLatin)附帶的'fix_latin'工具外星生命形式的代碼。 – ikegami

3

我爲此使用vim,但我想它可以在任何編輯器中完成。

  • 選擇(shift + v)要更改編碼的文本塊。

  • 類型:ENCA -L郎 - (與你的語言代替「郎」,我用「ENCA -L CS」然後ENCA工具應該告訴你所選塊的最可能的編碼)。

  • 按u(所以你撤消出現在你的文字ENCA的答案)

  • 再次選擇該塊,此時運行:!-f的iconv -t determined_encoding UTF-8

注意vim自動擴展按:到:\ <,>當您處於可視模式時,這正是您想要在文本塊上運行程序的要求。