2009-06-02 18 views
2

UTF-8以外のサイトで出力されているため、一部のファイルをUTF-8に変換する必要があります。不明なファイルのエンコーディングをUTF-8にバッチ変換する

私は今これを行うことができます。または、私が読んでいる間に行うことができます(PHPを使用して、単にfopenを使用し、空想的ではありません)。どんな提案も大歓迎です。

+0

はそれだけで間違ったエンコーディングのですか、単にいくつかのグリフが欠落しているあなたは確かにいますか? – Gumbo

+0

UTF-8以外のキャラクタ・セットで書かれていることを確かめてください。複数のファイルは同じdodgy文字(e-acuteなど)に対して同じ結果を示します。 – Oli

答えて

7

私はない行うことができますPHPのための明確な解決策を持っていますが、私は個人的にファイルがどのようなエンコーディングとして記述されているかを推測するのにかなり良い仕事をします。Universal Encoding Detector libraryを使用しました。

私は変換を行うために使用したPythonスクリプトを使用しています(元の目的は、日本語のコードベースをUTF-16とShift-JISの混合から変換したかったことです。 chardetは、エンコーディングを検出する自信がない場合)、デフォルトの推測をした:

import sys 
import codecs 
import chardet 
from chardet.universaldetector import UniversalDetector 

""" Detects encoding 

Returns chardet result""" 
def DetectEncoding(fileHdl): 
detector = UniversalDetector() 
for line in fileHdl: 
    detector.feed(line) 
    if detector.done: break 
detector.close() 
return detector.result 


""" Reencode file to UTF-8 
""" 
def ReencodeFileToUtf8(fileName, encoding): 
    #TODO: This is dangerous ^^||, would need a backup option :) 
    #NOTE: Use 'replace' option which tolerates errorneous characters 
    data = codecs.open(fileName, 'rb', encoding, 'replace').read() 
    open(fileName, 'wb').write(data.encode('utf-8', 'replace')) 

""" Main function 
""" 
if __name__=='__main__': 
    # Check for arguments first 
    if len(sys.argv) <> 2: 
    sys.exit("Invalid arguments supplied") 

    fileName = sys.argv[1] 
    try: 
     # Open file and detect encoding 
     fileHdl = open(fileName, 'rb') 
     encResult = DetectEncoding(fileHdl) 
     fileHdl.close() 

     # Was it an empty file? 
     if encResult['confidence'] == 0 and encResult['encoding'] == None: 
      sys.exit("Possible empty file") 

     # Only attempt to reencode file if we are confident about the 
     # encoding and if it's not UTF-8 
     encoding = encResult['encoding'].lower() 
     if encResult['confidence'] >= 0.7: 
      if encoding != 'utf-8': 
       ReencodeFileToUtf8(fileName, encoding) 
     else: 
      # TODO: Probably you could make a default guess and try to encode, or 
      #  just simply make it fail 

     except IOError: 
      sys.exit('An IOError occured') 
+0

ありがとうございます。私はこれに基づいてバックグラウンドで実行する小さなスクリプトを書いて、ファイル(そのPHPソース)をUTF-8に保ちます。 – Oli

+1

ユニバーサルエンコーディング検出ライブラリの上のリンクは410です。以下は動作するURLです:http://pypi.python.org/pypi/chardet – jeffbyrnes

+0

@jeffbyrnesヘッドアップに感謝し、上記のリンクを修正しました;) –

3

パフォーマンスを向上させ、将来のエラーの可能性を減らすことができますが、エンコーディングがわからない場合は、まったく正しい変換を実行できません。

2

この時私の最初の試みは次のようになります。それは構文的に有効なUTF-8である場合

  1. 、それはUTF-8だと仮定します。
  2. 有効な文字に対応するバイトがISO 8859-1(Latin-1)にある場合は、 と仮定します。
  3. それ以外の場合は、失敗します。
1

ファイルに異なるコードページのデータが含まれていますか?

「はい」の場合、バッチ変換は一切できません。ファイル内のすべてのサブ文字列のすべてのコードページを知る必要があります。

ファイルを一度に一括変換することはできませんが、ファイルに含まれるコードページが分かっていることを前提にしています。上の例と同じように、私たちは多かれ少なかれ、抽象化をサブ文字列スコープからファイルスコープに移しました。

あなた自身に質問する必要があります。一部のデータが属するコードページについての情報はありますか?もしそうでなければ、それはまだ醜く見えます。

あなたは常にあなたのデータにいくつかの分析を行うと、コードページを推測し、これはそれを少しfuglierを作るかもしれませんが、あなたはまだ推測されているので、それはまだ非常に醜いだろう:)

関連する問題