&の&への変換。

投稿アップデート情報  追記(7/19)  ……  追記3(7/20)  追記4(8/14)  追記5(2014/2/24)

 この間うち,シバケンさんとこの「シバケンの掲示板」で,「ひえの文字」という話があった。たまたま覗きに行ってたので,なんでだろうと思った。

 通常のひえは「稗」だが,くさかんむりのついた「薭」てのがあって,これが実体参照で「薭」ってやっても出ないという話だった。今どきのブラウザやOSで,そんなのありかなぁと思ったんだが,FHさんの「FHの掲示板」でも同じことが起こっていた。そういえば,TODOSで「惊奇日本」と書こうとしたときも「惊奇日本」になっちゃったよなあと思いだした。

 で,FHさんとこの掲示板は,KENTさんとこの「Joyful Note」だってことを知っていたので,これをダウンロードしてちょっと調べてみた。TODOSで使っている「WEB PATIO」はスレッド型で少し複雑なので,前にテスト設置したときに前もっての設定とかが面倒だった記憶があるので,「Joyful Note」を調べることにしたわけだ。

 「Perlのお勉強」も飽いちゃって,あのまま放置プレイだが,それでも,高々,6回しかやっていないこれが少し役に立ったね(爆)。joyful.zip を展開してできるinit.cgiにこういう部分があった。これの13行目で,問答無用で「s/&/&/g;」をやってるから,「薭」の頭の&が&になってしまって,実体参照が効かなくなるわけだ。

 じゃ,この行(つまり,13行目)をコメントアウトしてしまえばいいじゃないかというカスタマイズは,すぐに思いついた。が,割とちゃんとした掲示板の作り手のみんながみんな「& → &」ってことは,セキュリティでまずいからだろう。しかし,まずさの度合いが大したことなければ,目をつぶっちゃおうかと思ってググってみたが,あまりにも,常識なのか,どうまずいのかを教えてくれるところはなかなかなかった。そんな中で,なるほどと思ったのが,「【PHP関連】「&」(アンパサンド)をエスケープしなければならない実例」という記事。やはり,13行目を,問答無用でコメントアウトするのは,大変,まずいようだ。

 ということになれば,次に思いつくのは,&に続く文字の条件分岐で処理を分けてやろうということだ。しかし,Perlに疎い悲しさ,どうやったらいいかわからない。投げちゃおうかと思ったころに,運よく発見したのが,「&の実体参照への変換」。どんぴしゃり,やりたいことをやったサンプルスクリプトを置いてくださっていた。これを参考に(いや,流用して),init.cgiのフォームデコードの部分をこういうふうに書き換えた。

 で,実体参照に関係ない「&」はちゃんと「&」になり,実体参照はちゃんと実体が表示される「o6asanの掲示板Shift-Jis版」ができた。このテストのために作った「o6asanの掲示板」だが,これは自鯖上にはないから,このまま残しておいて,自鯖が落ちているときの連絡用として使うのも手だなと考えているところである。

追記(7/19):
 後知恵だが,ちゃんと表示されないのは「’JIS’ 補助漢字」なんだから,初めからUTF-8で行けばいいんじゃないのというわけで,「Joyful Note」のスクリプトをUTF-8デフォで作りなおしてみた。Perlがよくわかっていない私だが,これは割と簡単だった。
 Jcode::convert に関係あるcgi ファイル上の 12カ所の sjis を utf8 に書き換え。
 admin.cgi,check.cgi と tmpl 内の html 上の charset=shift_jis を charset=UTF-8 に書き換え。
 *.cgi,*.html,*.datをUTF-8エンコードで保存し直す。

 init.cgiの内容の書き換えは全くしないで,こんなことで,UTF-8デフォのJoyful Noteができた。 —>> ここにおいてます。

追記2(7/20):
 EUC-JPでも確認してみた。init.cgiを変更しなければ,「補助漢字」は表示されなかった。当たり前だが,
 Jcode::convert に関係あるcgi ファイル上の 12カ所の sjis を euc に書き換え。
 admin.cgi,check.cgi と tmpl 内の html 上の charset=shift_jis を charset=EUC-JP に書き換え。
 *.cgi,*.html,*.datをEUCエンコードで保存し直す。
の必要もある。EUC-JPデフォのJoyful Noteは ここにおいてます。

追記3(7/20):
 稼働中掲示板への対処だが,UTF-8に文字コードを直すのは大変で,現実的ではないと思う。

 init.cgiの差し替え方式なら,レンタル掲示板の場合であっても,管理会社の担当者がその気になってくれれば,「補助漢字」を表示させるのは可能だと思う。init.cgiを上書きアップロードすれば,上書き後に投稿される記事に限り,「補助漢字」が普通に表示されるようになり,そこまでに書き込まれていた掲示板の記事は影響を受けない。

 万が一,こちらのカスタマイズを利用される方がいるといけないので,大事なお約束事項を(爆)。
 お約束===この記事のカスタマイズを利用される方は,あくまでも自己責任でお願いいたします。

追記4(8/14):
 掲示板を整理した。で,もし落として違いを試してみようと思う方がいらっしゃったら,こちらへどうぞ。

追記5(2014.2.24):
 ドメインを移管したので, XREA においてあったものは,なくなった。

「&の&への変換。」への9件のフィードバック

  1. o6asanさん、こんにちは<!>

    イヤ、重要なる件を失念してたです。
    私の掲示板はレンタルでして。影の声、(知ってる<!>)

    イヤイヤ、且つは、
    「シバケンの掲示板」は、板数、定かに覚えてませんですが、多分なら、100板か、200板が最大でして。
    それ以降、順々に古いのが消滅するです。

    現時点、一番に古いのが、「2011/11/08」です。一年、保ってませんです。
    <注=設置 08/06/10>

    で、
    そんな次第のお好きなよに、して戴いて、構いませんです。

    ちなみに、日参とまでは、申しませんですが。
    こちら様には、限り無くの、日参的、覗きに来てるです。足跡超のタマですが<笑>

    1. シバケンさん,こんばんは。

      ご連絡ありがとうございました。

      > そんな次第のお好きなよに、して戴いて、構いませんです。

      ということですので,早速お言葉に甘え「HienoJi.html」というようにまとめ,記事内に転載させていただきました。

  2. これはおもしろいですね。
    TODOSのWebPatioでも試してみようかと思います。
    init.cgiは確認したのですが、まだフォームデコードのところは調べていません。近いうちに相談させていただくかもしれませんので、よろしくお願いします。

    これとは別の問題で、TODOSサイト作成時に私がはまったのが、こちらの問題です。
    http://www.shtml.jp/mojibake/sjis_cgi.html
    ソフトの「ソ」が化けるので、最初は、わけが分かりませんでした。で、ソフトではなくアプリケーションとしてみたりsoftと表示してみたり…
    何か特別な理由があるかも…と、後に調べたら、技術系でSuper FAQなんですねーーー
    で、対策し、やっとソフトと書くことができるようになりました。
    もちろん、これは、CGIスクリプトの中に書く「ソ」で、掲示板書き込みは問題ないです。
    o6asanさんが対策されたのは、掲示板書き込み時の特殊な文字ですね。これに該当する漢字は「薭」のほか、結構多いのかな?

    1. りりさん,こんにちは。

      東京は17日に梅雨が明けたそうですが,のっけから暑かったですね。こちらは,まだ明けていません。
      実は,所用で関東に出かけてまして,昨日帰ってきたのですが,梅雨明け後のとんでもない暑さに当てられて帰ってきました。うちは九州と言っても,わりに涼しいところなものですから,堪えました。帰ってくるとそれなりに仕事がありまして,今日はまた朝から出かけていました。お返事が遅くなりまして,すみません。

      > ソフトの「ソ」が化けるので、最初は、わけが分かりませんでした。

      バックスラッシュ関係の文字化けですね。改行マーク関係のことも結構面倒です。Perlをやりだしてハマったのは,ダブルクォートとシングルクォートの使い分けです。JavaScriptなどだと,内括弧と外括弧のような気分でよかった記憶があるのですが,Perlでは全く意味が違うものとして使われます。結構ハマりました。

      「薭」などの漢字の表示については,PerlのスクリプトそのものをUTF-8視点で書いてしまえば,あっさり行きます。UTF-8の場合,「薭」でも「稗」でも文字としてのサポートのレベルは同じですから。「Joyful Note」の基本の文字コードがShift-JISなものですから話がややこしくなります。「薭」などは補助漢字(魚拓です。サイトがなくなってしまいました。)に入っていますが,この辺のものはすべておんなじ状態ではないでしょうかね。文字コードについては,現時点でもいろいろと悩ましい問題があるようです。初めから地球的視野で統一した文字体系を決めておけばよかったのでしょうが,歴史を考えると無理な注文でしょうね。いろんな国のすべての表記を視野に入れてなんて,大変な難事業です。

      PerlのスクリプトをUTF-8に直して対応してやるのだと,init.cgiは触らなくても,スクリプトに含まれている何カ所かの「Jcode::convert」の部分をsjisからutf8に変更し,日本文字が入っているファイルの保存形式をutf8に直してやるだけで,補助漢字も表示されます。実際,「Joyful Note」については,そっちの方の改造もやってみました。ただ,こっちの改造はinit.cgiの改造をやった後で気づいたので,本記事から完全に落ちています。こっちの改造完成後,急に上で書いた関東行きが発生しましたもので(汗)。まぁなにしろ,発端が,FHさんのところとシバケンさんのところの「稼働中の掲示板のカスタマイズをやれるかな」というところからでしたから。しかし,これについても,本記事に追記しておいた方がいいでしょうね。

      ということで,その辺りのことを本記事に追加しました。

  3. o6asanさん、詳しくお返事ありがとうございます。

    >PerlのスクリプトをUTF-8に直して対応してやるのだと

    そうですね。
    私が前のコメントにリンクしたこちらでも
    http://www.shtml.jp/mojibake/sjis_cgi.html

    >もう一つの方法は、文字コードをShift_JISではなく、EUC-JPで作成することです。EUC-JPの漢字にはメタ文字は、現れません。ですから、エスケープ処理が必要ありません。

    とあり、Shift_JISを使っていくのは、どうかなーと思ったところです。
    この方は、EUC-JPで…と書かれていますが、UTF-8とどちらを選ぶのが良いかな…CMSを使うとき、迷った覚えがあります。

    >i-modeサイトの構築時や、デザイナーとの仕事の連携の関係でどうしてもShift_JISで開発しなければならない場合

    とも書かれていて、Shift_JISも残されていくのか…いろいろ厄介ですね。

    1. > この方は、EUC-JPで…と書かれていますが、UTF-8とどちらを選ぶのが良いかな…CMSを使うとき、迷った覚えがあります。

      最近は,サーバ,クライアントともに,処理能力は上がっていますから,負担・スピードという意味でのデメリットは減っては来ているでしょう。私は,MovableTypeでブログを作ったときから,UTF-8を使っていますが,Win2000上でブログの復旧をするときに,DOS窓からUTF-8が使えずに手こずった記憶があります。

      最近では,レンタルサーバでもUTF-8に対応していますから,多言語対応と言う意味ではそちらを使ったほうがベターかなと思ってます。英語と日本語のみだとあまりメリットを感じていませんが。今回の場合つまり「補助漢字」について,EUC-JPの場合はどういう挙動になるのでしょうかね。未チェックです(汗)。

      http://www.shtml.jp/mojibake/sjis_cgi.htmlについてですが,UTF-8の話がまったく出てきていないので,いつごろ書かれた記事だろうと思ったのですが,文面には日付がありません。で,サーバ上のファイルのタイムスタンプを取得してみたのですが,2006年の8月になっていました。と言うことは,書かれたのはこれより前であることは間違いないと思うので,UTF-8についてノーコメントなのも納得がいきました。

      > >i-modeサイトの構築時

      デザイナーとの連携は,昨今の情勢ならデザイナーに「UTF-8の勉強をしろ」とプレッシャーをかけるのもアリだと思うのですが,i-modeの場合は……
      たしか,Shift-JISとUTF-8に対応しています。で,新しい機種は,UTF-8に対応しているのですが,昨年の時点でこんな質問がありましたので,まだまだ,Shift-JISにしておいたほうがいいのかもしれません。

      今回の私の「掲示板カスタマイズ」につきましても,稼働中の掲示板の文字コードを変えるのは大変です。後からやってみたのでわかりますように,スクリプトをUTF-8デフォにするほうが,Perl初心者(自分のこと)には簡単だったのですが,稼働中の掲示板への対処としては,init.cgiの差し替えのほうが現実的ですね。

      1. りりさん,こんにちは。

        追記です。 EUC-JP でも試してみました。こちらです。

  4. >EUC-JPでも試してみました。こちらです。

    おぉー、いつもながらの早業ですねーーー
    これは、特殊な漢字を出させる対応策ですね。

    バックスラッシュ関係の文字化けは、とにかくShift-JISを使わなければ、OK
    で、特殊な漢字の対策は、Shift-JISとEUC-JPは同じ。

    UTF-8だと、両方対策が必要ないが、稼働中掲示板をUTF-8に変更するのは難しい…ということで良いでしょうか?

    Kentさんのサイトでは、文字コードについての説明もありました。私が気づくのが遅かったんですね。
    http://www.kent-web.com/pubc/jcode/

    で、Kentさんのpostmailなどでは、最近UTF-8版というのも配布されだしたようです。

    http://ja.wikipedia.org/wiki/UTF-8
    なぜ、UTF-8か…というあたり、今回の現象で、やっと具体的に納得しました。

    1. りりさん,こんばんは。

      > Kentさんのサイトでは、文字コードについての説明もありました。私が気づくのが遅かったんですね。
      > http://www.kent-web.com/pubc/jcode/

      丁寧に説明くださっていますね。「Unicode すべての文字を2バイトで表し、世界中の文字を表現しようとしています。」とありますが,歴史を見ていますと,なかなか大変なようです。私は,よく違いがわかっていないために,2単語(UnicodeとUTF-8)を同じように使ってしまう傾向がありますが,本当は別物ですよね。
      http://ja.wikipedia.org/wiki/UTF-8 にはずいぶん細かく書いてあるんですね。

      > UTF-8だと、両方対策が必要ないが、稼働中掲示板をUTF-8に変更するのは難しい…ということで良いでしょうか?

      そうですね。スクリプトの該当部分を書き直して,関係ファイルをUTF-8でエンコードし直したのち,再アップロードすることになるわけですが,ログの処理が結構大変だと思います。投稿数が多い場合,ログも結構なサイズですが,これをすべてUTF-8でエンコードし直し,アップロードしないと,記事が文字化けすることになりますので。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください