BLOGTIMES
2010/06/19

Tracのdiffが文字化けするときは

  trac  charset 
このエントリーをはてなブックマークに追加

Tracのリポジトリに様々な文字コードのファイルを入れているとdiffが文字化けすることがあって困っていました。

本当はファイルの文字コードを統一すればベストなんでしょうが、プロジェクトの運営上、それはちょっと難しいのでなにかうまい回避策がないかといろいろ探してみたところ、対応方法が「文字コード混在の対処(Trac) | へっぽこメモ」にまとめられていたので、これを参考に作業してみたところ、文字コードが混在している場合でも文字化けしないようになりました。

ということで、以下作業メモ。

trac.iniに文字コードのデフォルトを設定する

とりあえず、デフォルトの文字コードを設定。
プロジェクトのtrac.iniに下記の設定を加えます。

trac.ini

[trac] default_charset = utf-8

Universal Encoding Detectorによるapi.pyの改良

文字コードの判定を改良するために、mimeview\api.pyにパッチをあてるのですが、その前にパッチで必要になるUniversal Encoding Detectorというライブラリを導入してやります。TracLightningを使っている場合の具体的な手順としては、easy_installが使えるので、コンソールを開いて下記のコマンドを実行してやるだけです。

easy_install chardet

その後、TracLightningの場合にはC:\TracLight\python\Lib\site-packages\Trac-0.11.4.ja1-py2.5.egg\trac\mimeview\api.pyに下記のパッチをあててやります。

api_py.patch

Original: http://naonao.ktkr.net/?p=501 --- api.py.org 2009-07-25 18:27:05.693605100 +0900 +++ api.py 2010-06-19 17:53:24.965250000 +0900 @@ -71,6 +71,10 @@ from trac.util.text import to_utf8, to_unicode from trac.util.translation import _ +try: + from chardet.universaldetector import UniversalDetector +except ImportError: + pass __all__ = ['get_mimetype', 'is_binary', 'detect_unicode', 'Mimeview', 'content_to_unicode', 'Context'] @@ -825,6 +829,19 @@ utf = detect_unicode(content) if utf is not None: return utf + + if 'UniversalDetector' in globals(): + vf = StringIO(content) + detector = UniversalDetector() + for line in vf.readlines(): + detector.feed(line) + if detector.done: break + detector.close() + del(vf) + cset = detector.result['encoding'] + if cset is not None: + return cset + return self.default_charset def get_mimetype(self, filename, content=None):

    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/3611
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン