文字化け対応
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-jp が utf-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) のサイトに移行が完了しました。