Tracのソースビュアーで文字コードを自動判定する

ヤマロぶろぐ : Tracでファイルの文字コードを自動判定 - livedoor Blog(ブログ)Python でエンコーディングを判定する - 傀儡師の館.Python - 楽天ブログ(Blog)あたりを参考にして入れてみた。

chardetだとあまり判定が良くなかったのでpykf使ってみた

--- api.py.orig 2009-05-01 11:41:16.000000000 +0900
+++ api.py      2009-05-01 12:35:32.000000000 +0900
@@ -71,6 +71,21 @@
 from trac.util.text import to_utf8, to_unicode
 from trac.util.translation import _
 
+# For charset detection.
+CHARSET_RE = re.compile(r'coding[=:]\s*(\S+)')
+
+try:
+    # http://archives.sertice.org/devs/linux/cvs/pykf-0.3.4.tgz
+    import pykf
+    pykf.setdefault(pykf.EUC)
+    pykf.setstrict(True)
+    PYKF_ENC = {pykf.UNKNOWN:None, pykf.ASCII:'ASCII', 
+        pykf.SJIS:'SHIFT-JIS',  pykf.EUC:'EUC-JP',
+        pykf.JIS:'ISO-2022-JP', pykf.UTF8:'UTF-8',
+        pykf.UTF16:'utf-16', pykf.UTF16_BE:'utf-16_be',
+        pykf.ERROR:None}
+except ImportError:
+    pass
 
 __all__ = ['get_mimetype', 'is_binary', 'detect_unicode', 'Mimeview',
            'content_to_unicode', 'Context']
@@ -824,6 +839,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 'pykf' in globals():
+                encoding = PYKF_ENC[pykf.guess(content)]
+                if encoding != 'None':
+                    return encoding
         return self.default_charset
 
     def get_mimetype(self, filename, content=None):

なにげに初python

created by blog.nomadscafe.jp

コメント

posted by http://www.hatena.ne.jp/mmasashi/ | 2009-06-30 00:30:35

はじめまして。

以下の環境で構築した時に参考にさせてもらいました。(かなり助かりました)

  • WindowsXP SP2
  • Apache 2.2.11
  • Subversion1.6.1
  • Python 2.6.2
  • Trac0.11.4

ただ、docやxlsなどのファイルをチケットに添付した場合、

ダウンロード時にはエラーが出るため、

return encoding -> return str(encoding)

と変更して使ってます。

コメントを投稿

コメントを投稿するにはログインが必要です