MT4i version1.3β7仮公開

  • 投稿日:
  • by
  • カテゴリ:

 全記事がトップページから消えたので新たに投稿。
 ついさっき、ふと思いつきました。
 「mt.cfgがEUC-JP以外の文字コードで保存されていたらどうなるか?」と。
 MT4iは、頭でmt.cfgのPublishCharsetを読み込んで、そのBlogで使用している文字コードを判定しているんですがね。以下のような感じで。

####################
# PublishCharsetの取得
if (lc $mt->{cfg}->PublishCharset eq lc "Shit_JIS") {
$conv_in = "sjis";
} elsif (lc $mt->{cfg}->PublishCharset eq lc "UTF-8") {
$conv_in = "utf8";
} else {
$conv_in = "euc";
}

 MT4iのプログラムはEUC-JPで書かれています。例えば、Shift_JISの"UTF-8"とEUC-JPの"UTF-8"を比較するとこれ、イコールにならないんですよね。
 というわけで、もしもmt.cfgがEUC-JP以外の文字コードで記述されていた場合、上記ロジック後、$conv_inは100%、"euc"になります。あうう。
 この為、DBから読み込んだ文字列をすべて一旦EUC-JPに変換してあげる

if ($conv_in ne "euc") {
&$jcnv(\$_[0],'euc', $conv_in);
}

このロジックをスルーして、文字化けが発生していたものと思われます。

 もう一つ。知らなかったんですけど、Jcode.pmのz2hって全角カナを半角カナに変換するだけじゃなく、文字コードを自動判別してEUC-JPに変換しちゃうんですね(ですよね?)。上記ロジックをEUC-JPからUTF-8に変換するように書き直してうちで動かしてみたところ、何故かほとんど文字化けが発生せず、しかし「稀に」文字化けが発生するという、まさに悩まされていたのとまったく同じ症状が再現されました。Jcode.pmの自動文字コード判別は失敗することもあるようで(短い文字列だと特に)、それで「稀に」文字化けが発生していたものと思われます。
 しかし、この「稀に」というのに随分と悩まされました。みんな同じロジックを通っているはずなのに、文字化けするケースとしないケースがあるわけですからね。みんな文字化けしちゃってれば原因の特定は比較的容易なんですけど、症状が出たり出なかったりっていうのはとても厄介です。
 っていうか、これで本当に解決かどうかは未だ分からないんですが。
 というわけでβ7です。

・MT4i version 1.3β7(正式版を公開したのでリンクを外します)

 PublishCharsetの取得部分にて、mt.cfgより取得した文字列をEUC-JPに変換してから比較するように変更しました。
 有志の皆様の動作報告を、心よりお待ち申し上げます。