[目次へ][6章へ][6.4へ][7章へ] 最終更新:$Date: 2002/10/23 06:26:50 $


knjwrapの場合WinCvs側ですることは基本的には無い。漢字変換まわりについての考察は無くも無いけど書いてられないというか…。

最後の動作チェックは、これだけではなんだと思う…。


■■6.5 漢字コード変換を設定しよう
■■■ 6.5.1 cvswrappersを設定しよう
■■■ 6.5.2 漢字コード変換フィルタを作ろう
■■■ 6.5.3 フィルタを管理しよう
■■■ 6.5.4 cvswrappersに設定してみよう


■■6.5 漢字コード変換を設定しよう

Meadow/Mule for Win32や、複数の文字コードに対応しているエディタを使用していても、たとえば、TeXのファイルなどでは、UNIX環境ではEUCコードしか通らないとか、Windows環境ではSJISコードしか通らないということがありますね。こんなときは、やはりTeXのファイルは利用者の環境に合わせて文字コードを変換したいという考えが浮かぶでしょう。ネットワークを構成するホストの環境はさまざまですから、手元の計算機を様々な環境に適合するように調整しておくことは、後々自分の利益にも繋がります。本節ではCVSをEUCとSJISの2つの漢字コードに対応できるよう設定してみたいと思います。

■■■6.5.1 cvswrappersを設定しよう

CVSをknjwrp patchをあててコンパイルすると、管理ファイルcvswrappersに【図6.5.1】のような記述が追加されているはずです。1.10.8から微妙に書式が変わっているようです。

【図6.5.1】cvswrappersに追加された漢字コード変換のための行
▼
#*.cpp  -f '/usr/local/share/cvs/contrib/wrapack -s %s' -t '/usr/local/share/cvs/contrib/wrapack -e %s %s'
▲

この行を説明してみましょう。まず、#はコメント行の意味で、この行は実際には機能していません。この行を元に自分の環境に合ったカスタマイズをおこないます。最初の*.cppはファイルのパターンを意味します。このパターンに適合したファイルに対して、その行の残りの部分の処理が適用されます。残りの部分は、-f、-tというオプションとそれらの引数の並びで構成されています。

6.3.2節で簡単に説明したように、-fオプションはfromの意味でリポジトリから外部に出ていくファイルに対して適用されるフィルタを指定するためのものです。-tオプションはtoの意味で外部からリポジトリに入ってくるファイルに対して適用されるフィルタを指定するためのものです。-fオプションと-tオプションには/usr/local/share/cvs/contrib/wrapnkfという同じフィルタが指定されていますが、その引数-sと-eで動作が切り替えられています。なお、このフィルタはknjwrp patchをあてると自動的にインストールされます。

「最後に-sオプションはknjwrp patchで拡張された書式で、-sがついている場合のみ、remote-clietについてcvswrappers処理を有効にします。-sオプションは漢字コードを変換する場合は書いておいてください。」※この文章保留。もう使われてないようである。

■■■6.5.2 漢字コード変換フィルタを作ろう

さて、フィルタはどのような仕組みになっているのでしょうか?

/usr/local/share/cvs/contrib/wrapackの中を覗いてみましょう【図6.5.2】。このフィルタはソースツリーの中のcontribの下に作られます。

【図6.5.2】wrapackの中身
▼
#! /bin/sh
#
# wrappper ack filter for cvs-server/windoze-clients
#
# Usage: wrapack kanji_code infile [outfile]
#
TMP_EUC=/tmp/euc-cvs$$
TMP_SJIS=/tmp/sjis-cvs$$
opt=$1
infile=$2
outfile=$3

if [ $opt = "-e" ] ; then
        ack -S -u -e -z $infile > $TMP_EUC
        mv -f $TMP_EUC $outfile
elif [ $opt = "-s" ] ; then
    ack -E -s $infile > $TMP_SJIS
    mv -f $TMP_SJIS $infile
fi;
▲

wrapackの実体はシェルスクリプトで、内部でackという漢字コード変換プログラムを呼び出しています。漢字コード変換があたったcvsには、ackが組み込まれていて、cvsと同時にコンパイル、インストールされます。cvsのインストールされた場所を探してみてください。もともとは、ackはフリーウェアとして配布されていたもので、コードの高い認識率を誇るそうです。

▼ackのホームページ(VECTOR内 小笠原 博之さん)URL
http://www.vector.co.jp/soft/unix/util/se064384.html

実際の設定作業に取りかかる前に、環境における漢字コードの違いを整理しておきましょう。UNIXとDOS/Windowsのファイル形式には、次の違いがあります。また、DOS/Windowsのファイルには半角仮名が含まれていることがあり、これらはUNIX環境で問題を引き起こすことがあります。そのため、UNIXにファイルを転送する場合には、半角仮名を全角仮名へ変換しておく必要があります。

【表6.5.1】各環境でのファイルの違い
プラットフォーム	漢字コード	行末	ファイル終わり(EOF)
UNIX	EUC	LF(0x0a)
DOS/Windows	SJIS	CR/LF(0x0d,0x0a)	0x1a(Cntl-Z)がつくことがある
Mac(おまけ)	SJIS	CR(0x0d)

ackは、DOS/Windows環境からUNIX環境へ、ファイルを適合させるために必要な変換を、次の3つのオプションでおこないます。

【表6.5.2】ackのオプションの意味
オプション	意味
-e	出力コードをEUCにする
-u	入力の0x0d(CR)および0x1a(Cntl-Z)を取り除く
-z	いわゆる半角仮名→全角仮名変換をおこなう

ちなみに、同じ変換はnkfというフリーウェアでもおこなうことができます。まぁあえてnkfを使う必要はないかと思いますが、せっかく前版で書いたので代替案を書いてみます。

▼nkfのホームページ(琉球大学 河野 真治さん) URL
http://rananim.ie.u-ryukyu.ac.jp/~kono/software.html

0x1a(Cntl-Z)の削除は、nkfではできないので、UNIXの一般的な置換コマンドであるtrの削除オプション-dを使って削除するとよいでしょう。0x1aは8進数では32になります。RedHat Linuxの日本語版にはnkfが含まれています。

【表6.5.3】nkfで同様の変換をおこなうためのオプション
オプション	意味
-e	出力コードをEUCにする(半角仮名→全角仮名変換含む)
-Lu	行末を0x0a(LF)に変換する

一方、UNIX環境からDOS/Windows環境へファイルを適合させるために必要な変換は少なくとも2つあると思うのですが、wrapnkfではSJIS変換しかしていませんね。これは、CVSが自動的に変換してしまうからのようです。nkfには行末を0x0d,0x0a(CR/LF)に変換する-Lwというオプションがあるのですが、今回は使う必要がありません。

【表6.5.4】nkfでUNIXにファイルを適合させるためのオプション
オプション	意味
-s	シフトJISコードを出力する

これらの検討から、次のようにwrapackを作り直し、wrapnkfとしてみました。自分の環境に合わせたフィルタを各自作られるとよいかと思います。実行権限を与えるのをお忘れなく。

【図6.5.3】wrapnkf [wrapnkf.sh]
▼
#! /bin/sh
#
# wrappper nkf filter for cvs-server/windoze-clients 2
#
# Usage: wrapnkf kanji_code infile [outfile]
#
NKF=/usr/bin/nkf
# Line Terminator: CR/LF->LF(-Lu), LF->CR/LF(-Lw): No use
# Kanji Code: SJIS(-s), EUC(-e) including hankaku->zenkaku
TR=/usr/bin/tr
# Cntl-Z=\032(0x1a)

opt=$1
infile=$2
outfile=$3

if [ ${opt} = "-e" ] ; then
    ${NKF} -eLu ${infile} | ${TR} -d '\032' > /tmp/unkf-cvs$$
    mv -f /tmp/unkf-cvs$$ ${outfile}
elif [ ${opt} = "-s" ] ; then
    ${NKF} -s ${infile} > /tmp/wnkf-cvs$$
    mv -f /tmp/wnkf-cvs$$ ${infile}
else
    echo "Usage: wrapnkf [-s|-e] infile [outfile]"
fi;
▲

■■■6.5.3 フィルタを管理しよう

このせっかく作ったwrapnkfをCVSの管理下に置きたいと思います。CVSROOTの下に管理ファイルとして追加してみましょう。そうすれば、バラバラにならなくて済みます。CVSが管理ファイルとしてあらかじめ知っているもの以外のファイルを、管理ファイルと同じように扱うには、checkoutlistファイルに追加する必要がありました(6.1.3節参照)。【図6.5.4】では、wrapnkfをエラーメッセージ「Kanji Wrapper checkout failed」とともに設定しています。

【図6.5.4】checkoutlistファイルへ追加する行
▼
wrapnkf Kanji Wrapper checkout failed
▲

この設定が終わったら、wrapnkfをaddし、checkoutlistファイルと一緒にcommitしておきましょう【図6.5.5】。

【図6.5.5】wrapnkfを管理ファイルとして追加する
▼
% cvs add -m "Kanji Wrapper" wrapnkf
cvs add: scheduling file `wrapnkf' for addition
cvs add: use 'cvs commit' to add this file permanently
% cvs commit -m "New administerative file: wrapnkf"
cvs commit: Examining .
Checking in checkoutlist;
/home/cvsroot/CVSROOT/checkoutlist,v  <--  checkoutlist
new revision: 1.4; previous revision: 1.3
done
RCS file: /home/cvsroot/CVSROOT/wrapnkf,v
done
Checking in wrapnkf;
/home/cvsroot/CVSROOT/wrapnkf,v  <--  wrapnkf
initial revision: 1.1
done
cvs commit: Rebuilding administrative file database
▲

管理ファイルが再構築されて、/home/cvsroot/CVSROOT/wrapnkfが(実行権限付きで)できあがっていれば成功です。

【図6.5.6】wrapnkfの確認
▼
% ls -F /home/cvsroot/CVSROOT/wrapnkf
/home/cvsroot/CVSROOT/wrapnkf*
▲

■■■6.5.4 cvswrappersに設定してみよう

そして、最後にcvswrapprsに【図6.5.7】の行を追加します。この図では折り返されていますが、改行は入れないようにしましょう。

【図6.5.7】cvswrappersに追加する行
▼
*.tex   -f '/home/cvsroot/CVSROOT/wrapnkf -s %s' -t '/home/cvsroot/CVSROOT/wrapnkf -e %s %s' -s
▲

これをやはりコミットしておきます。

【図6.5.8】cvswrappersに追加する行
▼
cvs commit -m "Applied wrapnkf for *.tex"
cvs commit: Examining .
Checking in cvswrappers;
/home/cvsroot/CVSROOT/cvswrappers,v  <--  cvswrappers
new revision: 1.3; previous revision: 1.2
done
cvs commit: Rebuilding administrative file database
▲

登録が完了したら、動作を確認してください。つまり、test.texというようなファイル名末尾に.texのついたファイルを作って、UNIXとWindowsでやりとりをしてみてください。ちゃんと、変換できていることが確認できましたか? 確認したら、ほかの実際に変換したいファイルについて設定をおこなってください。また、個人ごとに変換したいファイルを変えたい場合は、個人環境設定ファイルの.cvswrappersを用いるのがよいようです。

ただし、pserverで個人環境設定を有効にするには、-fオプションで実行ユーザの環境変数を無効にし、inetdが環境変数HOMEを設定しない設定になっている必要があります。上で説明したenvコマンドを利用する設定方法などを試してみてください。ちなみにRedHat Linux 7.xのxinetdでは、envコマンドを利用しなければ、うまくいきませんでした。