(Trac-ja 0.10.3 でしか確認していませんがおそらく本家のTracも同様だと思います。)
プロジェクト内で文字コードが統一されていれば [trac]default_charsetを適切に設定することで問題無いのですが、 Windows向けとLinux向けのソースが混在するプロジェクトを管理する必要が生じたため、以下のパッチを作成しました。
Tracはリポジトリブラウザによるファイル表示や添付ファイルの表示の際、
- MIMEタイプの"charset="属性による判定
- BOMコードによるUnicode判定
プロジェクト内で文字コードが統一されていれば [trac]default_charsetを適切に設定することで問題無いのですが、 Windows向けとLinux向けのソースが混在するプロジェクトを管理する必要が生じたため、以下のパッチを作成しました。
既存の判定処理で判定不能な場合に追加で以下の判定処理を行います。
- EmacsやVIMのエンコード指定が存在すれば使用する。
(例: "# -*- coding: ENCODING_NAME -*-"あるいは"# vim:fileencoding=ENCODIG_NAME") - chardetモジュール(Universal Encoding Detector)が利用可能であれば、これを用いて判定する。
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):