パーソナルツール
現在の場所: ホーム zope 2.8 + plone 2.1 文字化け対応
書いた本
Plone 完全活用ガイド の Chapter 1, 2, 3, 11 を執筆しました。
plone のインストール、使い方から、機能・デザインのカスタマイズ、プロダクトの作り方まで、 plone のすべてがぎゅっと詰まっている書籍になっていると思います。
plone に興味がある人から、すでに使いこなしている方まで、ぜひ読んでみてください。
Plone 完全活用ガイドのサポートページ
ナビゲーション

 
文書操作

文字化け対応

作成者 takanori 最終変更日時 2006年12月14日 02時05分

plone サイトのアップグレードと同時に文字コードを euc-jp から utf-8 に変更したときの、後処理など

CJKCodecs をインストール

文字化けに対応するために、日本語の Codecs をインストールする。

丸数字等にも対応するために、ここでは JapaneseCodecs(http://www.python.jp/Zope/download/JapaneseCodecs) ではなく、 CJKCodecs(http://cjkpython.berlios.de/) を使うことにする。

インストールの手順は以下の通り。インストール後に zope の再起動を忘れずに行う。:

# wget http://download.berlios.de/cjkpython/cjkcodecs-1.1.1.tar.gz
# tar xfz cjkcodecs-1.1.1.tar.gz
# cd cjkcodecs-1.1.1
# python setup.py install
# /etc/init.d/zope restart

なお、python 2.4 の場合は最初から CJKCodecs が入っているので、この手順は不要。

スクリプト作成

コメントとユーザ情報の「氏名」の文字コードを euc-jp から utf-8 に変換するため、スクリプトを作成して各 plone site 上で実行する。:

catalog = context.portal_catalog

# 全コメントを取得
results = catalog.searchResults(meta_type='Discussion Item')
print "comments", len(results)
for result in results:
    # コメントのオブジェクトを取得
    comm = result.getObject()
    # コメントのタイトル、本文を euc-jp から utf-8 に変換する
    title = unicode(comm.title, 'euc_jis_2004').encode('utf-8')
    comm.setTitle(title)
    desc = unicode(comm.description, 'euc_jis_2004').encode('utf-8')
    comm.setDescription(desc)
    text = unicode(comm.text, 'euc_jis_2004').encode('utf-8')
    comm.manage_editDocument(text=text, text_format='plain')

# 最終更新日を再設定したいアイテムを全部取得
results = catalog.searchResults(meta_type=['Discussion Item', 'ATFile', 'ATImage'])
print "comments, files, images", len(results)
for result in results:
    item = result.getObject()
    # 最終更新日を作成日と同じにする
    item.setModificationDate(modification_date=item.created())

# メンバーの ID を全部取得  
ids = context.portal_membership.listMemberIds()
for mid in ids:
  # メンバーの情報を取得
  user = context.portal_membership.getMemberById(mid)
  # 氏名の文字コードを euc-jp から utf-8 に変換する
  fullname = unicode(user.fullname, 'euc_jis_2004').encode('utf-8')
  context.plone_utils.setMemberProperties(mid, fullname=fullname)
    
return printed

ZWiki のタイトルと本文を変換

ZWiki(http://zwiki.org) もタイトルと本文が euc-jp のままなので、下記のスクリプトを実行して utf-8 に変換する。:

catalog = context.portal_catalog

results = catalog.searchResults(meta_type=['ZWiki Page', 'ZWiki Folder'])
print "zwiki", len(results)
for result in results:
    wiki = result.getObject()
    title = unicode(wiki.title, 'euc_jis_2004').encode('utf-8')
    text = unicode(wiki.text(), 'euc_jis_2004').encode('utf-8')
    wiki.setTitle(title)
    wiki.setText(text)

return printed

id を変換

しかし、これだけではうまくいかない。

Wiki ではタイトルから自動的に id が作成される、リンクの部分も同様である。

タイトルの文字コードが euc-jputf-8 に変わったことにより、アイテムの id も utf-8 から作成したものに変更しなおさないといけない。

例えば、 「**資料**」 というタイトルの Wiki ページは以下のような id となる

  • euc-jp X_bb_f1_ce_c1
  • utf-8 X_e8_b3_87_e6_96_99

下記の Pythojn Script を実行して、日本語タイトルの Wiki ページの id を変更する。:

import re

catalog = context.portal_catalog
zwikiidcharsexpr = re.compile(r'[a-zA-Z0-9.-]')
spaceandlowerexpr = re.compile(r'\s+([%s])'%(string.lowercase))
escape = '\\!\\"\\#\\$\\%\\&\\\'\\(\\)\\*\\+\\,\\-\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\\\\\]\\^\\_\\`\\{\\|\\}\\~'

results = catalog.searchResults(meta_type=['ZWiki Page', 'ZWiki Folder'])
print "zwiki", len(results)
for result in results:
    wiki = result.getObject()
    url = wiki.absolute_url()
    id = wiki.id()
    # タイトルを取得
    name = wiki.title
    # 日本語を含んでいるか判断
    if id.find('_') != -1:
        # 日本語タイトルから id を作成する
        name = re.sub(r"'",r"",name)
        name = re.sub(r'[%s]+' % escape, r' ', name)
        newid = ' '+name
        newid = spaceandlowerexpr.sub(lambda m:string.upper(m.group(1)),newid)
        newid = string.join(string.split(newid),'')
        safeid = ''
        for c in newid:
            if zwikiidcharsexpr.match(c):
                safeid = safeid + c
            else:
                safeid = safeid + '_%02x' % ord(c)
        if len(safeid) > 0 and safeid[0] == '_':
            safeid = 'X'+safeid

        # id が元と違っていれば変更する
        if id != safeid:
            print wiki.title
            print wiki.absolute_url()
            print id
            print safeid

            # フォルダを取得して、新 id にクローンを作成する            
            folder = wiki.aq_parent
            folder.manage_clone(wiki, safeid)
            # 旧 id の Wiki ページを削除する
            folder.manage_delObjects(ids=[id,])
            print folder.absolute_url()

return printed

このスクリプト実行後、``portal_catalog`` の Advanced タブを開いて、カタログのアップデートを行う。

Wiki ページ間のリンクがきちんとはられていることを確認する。

以上、これで一応 zope 2.7.8/plone 2.0.5(euc-jp) のサイトから zope 2.8.8/plone 2.1.4(utf-8) のサイトに移行が完了しました。


Powered by vine linux, python, zope, plone, coreblog