(Trac-ja 0.10.3 でしか確認していませんがおそらく本家のTracも同様だと思います。)

Tracはリポジトリブラウザによるファイル表示や添付ファイルの表示の際、

  1. MIMEタイプの"charset="属性による判定
  2. BOMコードによるUnicode判定
の順に判定を行い、 判定不能の場合は設定ファイルの[trac]default_charsetを使用します。
プロジェクト内で文字コードが統一されていれば [trac]default_charsetを適切に設定することで問題無いのですが、 Windows向けとLinux向けのソースが混在するプロジェクトを管理する必要が生じたため、以下のパッチを作成しました。

既存の判定処理で判定不能な場合に追加で以下の判定処理を行います。

  1. EmacsやVIMのエンコード指定が存在すれば使用する。
    (例: "# -*- coding: ENCODING_NAME -*-"あるいは"# vim:fileencoding=ENCODIG_NAME")
  2. chardetモジュール(Universal Encoding Detector)が利用可能であれば、これを用いて判定する。
これでも判定できない場合、[trac]default_charset設定を使用します。
diff -ru trac-0.10.3-ja-1/trac/mimeview/api.py trac-0.10.3-ja-1/trac/mimeview/api.py
--- trac-0.10.3-ja-1/trac/mimeview/api.py       2006-12-09 19:06:15.000000000 +0900
+++ trac-0.10.3-ja-1/trac/mimeview/api.py       2007-02-20 16:35:19.000000000 +0900
@@ -65,6 +65,17 @@
 from trac.util.text import to_utf8, to_unicode
 from trac.util.html import escape, Markup, Fragment, html

+# For charset detection.
+CHARSET_RE = re.compile(r'coding[=:]\s*(\S+)')
+
+try:
+    # Universal Encoding Detector
+    # http://chardet.feedparser.org/
+    import chardet
+    CHARDET_CONFIDENCE_LIMIT = 0.8
+    CHARDET_MAX_SAMPLE = 1000
+except ImportError:
+    pass

 __all__ = ['get_mimetype', 'is_binary', 'detect_unicode', 'Mimeview',
            'content_to_unicode']
@@ -521,6 +532,15 @@
             utf = detect_unicode(content)
             if utf is not None:
                 return utf
+
+            m = CHARSET_RE.search(content, 0, 200)
+            if m:
+                return m.group(1)
+
+            if 'chardet' in globals():
+                result = chardet.detect(content[:CHARDET_MAX_SAMPLE])
+                if CHARDET_CONFIDENCE_LIMIT < result['confidence']:
+                    return result['encoding']
         return self.default_charset

     def get_mimetype(self, filename, content=None):