Yukinobu Hamuro
hamur****@adm*****
2004年 2月 3日 (火) 09:45:28 JST
羽室です >tar.gzからmusashiの文字コードをUTF-8でインストールしました。 > >Checkを解凍し、そのまま走らせた(euc-jpのまま)のと、 >Checkの中の全てのファイルをUTF-8に変換してから走らせたのがあります。 > >1、check.shをそのまま走らせた場合headerでNGが出てましたが, > bodyの部分は全てOKでした。 > > NGが出ているコマンドのheaderはencoding=UTF-8で出力されています > コマンドによってencoding=euc-jpとUTF-8が出てくるのはなぜなのでしょうか? UTF-8環境ではチェックスクリプトは動作しないことはわかっています。 その理由を以下に書きます。 a) MUSASHIのXMLTableのエンコーディングに関するルール ・XMLtableに対する処理ではXMLパーサー(libxml2)は利用せず、独自でパースしている。 ・その際、エンコーディング変換は一切おこなっていない!!(処理速度追求のため) ・libxml2などのパーサは、どのようなエンコーディングを利用していようが、一旦内部でUTF-8に変換します。 ・そして出力時にオリジナルのエンコーディングに再変換します。 ・この2度の変換により処理効率が非常に悪くなるので、独自パーサーではエンコーディングは一切しないことにしました。 ・入力のXMLTableに記述されたエンコーディング名は、そのまま出力ファイルに引き継がれます。 ・Body要素(データ部)はCDATAなので、libxml2パーサを使おうが独自パーサーを使おうがエンコーディングのチェックは一切おこなわず、##そのまま##処理されることに なります。 ・スクリプトやコマンドラインからの入力文字はUTF-8ですので、例えばEUCの入力ファイルに項目を付け加えるような処理をすれば、その項目名だけはUTF-8になってしま います。出力エンコーディング名は、入力エンコーディング名を引き継ぎますので、そこで矛盾が生じます。 ・入力データのない処理、例えばxtmkdataなどでは、デフォルトのXMLエンコーディング(setencdoc.shで指定)を出力時のエンコーディングに利用します。 # 以上のようなややこしいルールを適用しているのは、全てXMLtableに対する処理効率を向上させるためです。 # 将来UTF-8環境がデフォルトになればlibxml2パーサを組み込み、上記のややこしさは解決できるかもしれません。 >2, Check以下のファイルの文字コードをUTF-8に変換し, > encoding="euc-jp"?と記述されているファイルを全てencoding="UTF-8"?に変換後 > check.shを走らせた場合 > > ERRORはありませんでした すばらしい。 非常に手間なことをやっていただき感謝です。 > #NG > 1, xtcal -c 'datefmt($日付,"%Y年%M月%D日%j曜日")' -a 年月日曜日 > -i $in/dat.xt -o $out/${cmd}22.xt > > 曜日の出力がおかしいのですが,なぜか僕には分かりませんでした。 どのようにおかしいでしょうか? > 2, xtcal -c 'length($商品)' -a 商品バイト数 -i $in/dat.xt -o >$out/${cmd}46.xt > > 漢字に対するバイト数がおかしい > UTF-8とEUC-JPでは漢字1文字のバイト数が違うからでしょうか なるほど。 MUSASHIの文字についての取り扱いは、あくまでもバイト単位であって漢字単位にはなっていません。 これはglibcの標準関数(strlenなど)を利用しているためです。 この問題を真剣に解決しようとすると多大な努力と時間が必要になってきます。 strlenなどはかわいい問題ですが、正規表現をどうするかが非常に頭の痛い問題です。 UTF-8がデフォルトになればまだよいのですが。。。 > 3, xtcut -f 店,数量 -i $in/dat.xt -z -o $out/${cmd}03.xt > xtcut -f 店,数量 -r -i $in/dat.xt -z -o $out/${cmd}04.xt > > 圧縮を使用すると、先ほどもありましたように,漢字1文字に対するバイト数の > 違いからバイナリファイルでは差が出てくるのかもしれませんね。 それはそうですね。 > 4, advance/script/visit2.shでNG > > これは xtnumber -k 年月 -s来店回数%nr -a順位 | > での並べ替えが原因です。cygwinの時と同じようです 先の曜日の問題も含めて、前と同じところでエラーが出ているようですね。 最新のCheckスクリプトを利用していますか? users-203を参考に願います。 報告ありがとうございます。 ---- Yukinobu Hamuro hamur****@adm*****