一部分だけ文字化けする謎に挑んでみた!

先日書いた記事でも述べたが、私設松本零士博物館サイトのGoogle流入数が少ないのがずっと悩みのタネで、「まずはサイトのページ表示速度の改善だ!」と思い、記事に書いたようにページ表示速度を改善した(本サイト=WordPressはちょっと手抜きだが)。
次はページ構成を変更する改善をするのだが、それには以前よりアイデアを温存していたPukiWiki用アフィリエイトプラグイン「MyDo(まいど)」をバージョンアップし、正式公開しなければならない。
ところが、「一部分だけ文字化けする謎」が大きく立ちはだかった。
この3連休中は別の記事を書こうと思っていたが、同じように困っている人がいるかも知れないので、情報を共有したいと思う。

一部分だけ文字化けする謎とは?

私が遭遇した「一部分だけ文字化けする謎」を説明するには、PukiWiki用アフィリエイトプラグイン「MyDo(まいど)」の仕組みを少し説明する必要がある。

PukiWiki用アフィリエイトプラグイン「MyDo(まいど)」

図はアフィリエイト情報と各ECサイトに飛ぶアフィリエイトリンクを表示した「MyDo(まいど)」の例だが(動作する実物はPukiWiki改造普及活用計画サイトの「アフィリエイトプラグイン」ページにある)、図のYAMADAモールでだけ「一部分だけ文字化けする」事象が発生する。
「MyDo(まいど)」の仕組みを簡単に説明すると、AmazonASIN(商品識別番号)を指定すると、Amazonから商品画像と商品情報(商品名や商品説明、販売金額等)を自動で取得して表示する。
Amazon以外のECサイトは、Amazonから取得した商品名を独自に編集して契約しているAPS(アフィリエイトサービスプロバイダ)経由で各ECサイトに飛ぶリンクを出力する。
図の場合でザックリ言えば、「パナソニック デジタルカメラ ルミックス FZ85 ブラック DC-FZ85-K」を検索キーとしてASP経由で各ECサイトへ飛ぶリンクを編集しているのだ。
ネットの文字コードにUTF-8が普通に使われる現代において、ウェブサイト間のURLエンコードで文字化けなんて発生しないし、発生するとしたらただの大バグ野郎だ。
ところが「YAMADAモール」ボタンだけ、違ったのである。

図のように「一部分だけ文字化けする謎」が現出した。
最初はShift-JIS5C問題かな?と思ったが、良く見るとダメ文字じゃない文字が化けている。
別のケースをテストしてみると・・・

ワシの大好きなデュワーズでもなんかい!?Σ(゚Д゚ノ)ノ
しかも先頭の「」からして化けている。
カタカナの一部だけが文字化けするなんてあるんじゃろか・・・?
ググりまくったが、そんなケースの情報は発見出来なかった

解決した方法

ググり倒しても参考になる情報はないし、原因が分からない
そこで推測するしかないが、ASP経由で送出されたリンクをYAMADAモールのECシステムが受け取る際に、何らかの文字コード変換をしていて、恐らくUTF-8に変換した結果、一部の文字が化けたのではないか。
とすると、Shift-JIS5C問題のように文字化けする文字に円マーク「\」を付けてエスケープしてやれば良いのでは?
実験してみると文字化けがなくなったので、推測は当たっていたようだ。
だが、どの文字が化けるのかが不明だから、推測は当たっても解決とはならない
そこで、次の文字化けテスターで化ける文字(ひらがな・カタカナ・記号)を調べてみた。

上記文字化けテスターで調べた結果は次の表の通り。

ひらがなうえおこそむやゆよろん
ひらがな濁音ごぞだ
ひらがな拗音ぅぇぉゃゅょ
カタカナテトノヘホム
カタカナ濁音ダデドベボペポ
カタカナ濁音ダデドベボペポ
カタカナ促音
記号。ー~「」【】『』゛゜■◆◇”!”#$%&’|`{-@[;,/

・・・65文字もあるんかよ。Σ(´Д`;)
まぁ、関数を一発作ればどうってことないので、PHPで作ってみた。

引数の文字列に要エスケープ文字が含まれていた場合「\」を追加する関数

function add_yen($str) {
                                        // 要エスケープ文字
    $zenkaku = ['う', 'え', 'お', 'こ', 'そ', 'む', 'や', 'ゆ', 'よ', 'ろ', 'ん', 'ご', 'ぞ', 'だ', 'ぅ', 'ぇ', 'ぉ', 'ゃ', 'ゅ', 'ょ', 'テ', 'ト', 'ノ', 'ヘ', 'ホ', 'ム', 'ダ', 'デ', 'ド', 'ベ', 'ボ', 'ペ', 'ポ', 'ッ', '。', 'ー', '~', '「', '」', '【', '】', '『', '』', '゛', '゜', '■', '◆', '◇', '”', '!', '”', '#', '$', '%', '&', '’', '|', '`', '{', '-', '@', '[', ';', ',', '/'];
                                        // 文字列を再構成する
    $rebuild = '';
    foreach(preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY) as $val) {
        if (in_array($val, $zenkaku)) {
            // 要エスケープ文字の場合
            $rebuild .= $val . '\\';
        } else {
            // 要エスケープ文字以外
            $rebuild .= $val;
        }
    }
                                        // 戻り値セット
    return $rebuild;
}

上記関数を「MyDo(まいど)」プラグインに組み込み、文字化けが発生するYAMADAモールのみ、商品名を上記関数を通してからURLエンコードするようにしてみた。

問題ない。

愛するデュワーズも問題ない。

これも問題ない。
一通り「MyDo(まいど)」プラグインをテストし、正式公開版としてリリースした。

実は漢字も一部が文字化けする

プラグインもリリースしたし、私設松本零士博物館サイトのページ構成を変更しようとしたところ、思わぬ伏兵がいた。

図の通り、漢字も一部分だけ文字化けしたのである。マイガッ!
図の例では「鉄道」と「」が化けているが、困ったことに「\」でエスケープしても、「」だけは化けたままなのだ。
一体、「駅」の文字情報の何が欠落したのだろうか?
そこで、Shift-JISの先頭の漢字「亜」(文字コード:88 9F)から30文字を文字化けテスターで調べてみた。

図のように、30字中11字が「復元できない文字化け」であることが分かる。
では、「\」でエスケープしたろどうなるのか?

図の通り、図赤枠の1文字だが「」の字は「\」でエスケープしても「」と同様に化けたままとなっている。
JIS第2水準の誰も使わないような漢字ならそんなに大きな問題ではないが、当用漢字で誰もが使うような漢字が化けてしまうのでは大問題だ。
プラグインの仕様としてYAMADAモール外そうかとも考えたが、昨晩リリースしてしまっている
リリースに関しては色々と反省点はあるが、ここは運用で逃げるしかないと結論した。
文字化けする商品名の場合はプラグインの引数でYAMADAモール指定(’yamada‘)を外せば良いし、文字化けしない商品名の場合はそのまま使えるし、サイト訪問者にも使ってもらうことが可能だ。

おわりに

あえて自画自賛するが、PukiWiki用アフィリエイトプラグイン「MyDo(まいど)」は、我ながら素晴らしく画期的なプラグインだと思う。
最初のASPの設定はちょっと大変だが、それさえやってしまえば、AmazonASINひとつでAmazon楽天市場Yahoo!ショッピングオムニセブン(イトーヨーカドーネット通販)・YAMADAモールQoo10hontoebookjapanに対応したアフィリエイトリンクを自動的に作成し、商品画像や商品説明、価格といった情報とリンクボタンがレスポンシブデザインで表示出来るのだから。
WordPressにもアフィリエイトプラグインはいくつかあるし、私も利用しているが、Amazon楽天市場Yahoo!ショッピング以外には対応していなかったり、対応出来てもいちいち手動でリンク設定等をやらねばならず、結構面倒だったりする。
某汎用ブログパーツに頼っていた時代から比べれば便利になったが、たかだか数パーセントのアフィリエイト料率でそこまでやるか?と問われれば、難しいところだろう。
来月(2022年10月)にはYahoo!ショッピングPayPayモールが統合するとASPからメールが来ていたが、モールを統合することで取扱商品点数が大幅に増えるだろう。
Yahoo!ショッピングとしてはAmazon楽天市場との競争優位性を高めたいのだろうが、Qoo10はそんなに知名度はないにもかかわらず、商品点数は3,000万点にも及ぶ。
今回の「一部分だけ文字化けする謎」のYAMADAモールは350社が参加し、商品点数は10万点と他のモール系ECサイトに比べれば見劣りするものの、家電小売販売大手が運営しているから、今後の伸びしろはあると思う。
コロナ茶番を経てオンライン化の促進と消費行動が大きく変わったのだから、「MyDo(まいど)」のようなアフィリエイトプラグインが今後も活躍することだろう。
ネットで売るオリジナル商品やサービスがないのならば、誰かが作ってくれた商品や書籍を物販するアフィリエイトしかないのが道理なんだよ。


Warning: strpos() expects parameter 1 to be string, array given in /home/eware/dajya-ranger.com/public_html/wp-includes/compat.php on line 473

Warning: preg_match_all() expects parameter 2 to be string, array given in /home/eware/dajya-ranger.com/public_html/wp-includes/shortcodes.php on line 155
Array

この記事が気に入ったら
いいね ! をお願いします


ITで何かお手伝い出来ることはありませんか?

CTA-IMAGE

本サイトでは、外部サービスと連携して「ITの困った」を解決します!

ソフトウェアカテゴリの最新記事