| | ● その後の文字化け [ 017 ] 先の時間のズレを契機に、課題となっていた「文字検索時の文字化け」に取り組んだ。 半年振りにPerlに接したので、すっかり忘れていたけど、2時間ぐらい集中してスクリプトを見ていたら、おぼろげに記憶が蘇ってきて、その記憶とは「ずいぶん繁雑で、つぎ足しばかりのタコ足風スクリプトだなぁ」。 蘇ったけど現状は変らず。また半年前に戻ってチャレンジ。
shift_jisにしてもeucにしても、/$word/ マッチだと、どうしても文字化けしてしまうのがある。16進方表記での記号の重なりからというのは何となく分かった。 諦め風一休みして「CGI & Perl ポケットリファレンス (技術評論社刊)」というのをペラペラと見ていたら、「index」という関数が目に留まった。 「文字列中に部分文字列が最初に現れる位置を返す」と記されていて、見つからなかったら、-1が戻ってきて、行頭なら0、それ以降ならそれ以上。 つまり、0以上なら検索ヒットするかもと思って、入れてみたら、おお、ちゃんと正確に該当発言を抜き出してくれた。 しかし、文章の中からある単語を検索するのだから、該当単語は色分け強調したいものだ。長文だと何処にその単語があるのかが分からないからだ。
andとor、つまり検索単語が複数あるから、1つの発言を検索単語の数だけforeachでチェックしなければならない。 indexだと先の16進方表記での記号の重なりからの文字化けがないので(のようだ)、indexでヒットした文章だけ /$word/ して文字色を変えれば良い。ただしeucにしないと駄目だ。 しかし、そのままeucで引き続きチェックすると何故か上手くヒットしない。この「何故か」というところでお里が知れてしまう。 良く勉強し基礎を理解していれば、その原因を近似値で予想しながら修正できるのだが、それがないと大ざっぱぐらいにしか原因を絞り込めず、そこから人海戦術風片っ端から試してゆくという非常に原始的な試行になってしまうのがいとかなし。
その都度、sjisに変換し、それをforeachで戻る度にeucに変換をすれば、望んだ通りの結果になった。 トリッキーと言おうか、かなり無駄があるように見えるが、データーベース用ではないので、今回のお勉強はこれで良しとした。つまり、力尽きた訳だ。 課題をクリアーしたらまた新たな課題出現。相変わらずPerlは手強い〜。 |
|