MT5 Shift-JISでの「~」(波ダッシュ問題)

※最初に書いた記事は間違っていたようなので書き直しました。
MovableTypeで、PCと携帯の両方に対応するサイトの制作を行いました。
携帯に対応と言うことで、文字コードは「Shift-JIS」にします。
しかし、MySQLの文字コードをShift-JISにすると、何かと問題が出るので、内部はUTF-8で統一し、出力時にShift-JISにすることにしました。
そこで便利なのが、「CharsetEncoder プラグイン」です。
これを導入して、文字エンコーディングを「Shift-JIS」に設定して再構築すれば、ほとんど難しいことを考えずにShift-JISのサイトが出来上がります。
・・・と思ったら、クライアントから、『「~」が、「?」に化ける』と言われてしまいました。
いわゆる、「UTF-8の波ダッシュ問題」というやつです。
実は、「CharsetEncoder プラグイン」には、「cp932エンコーディング」というものも用意されています。
これは、ずばり「~」対策のための機能な訳ですが、その設定をしているにもかかわらず、「~」が「?」になってしまうのです。
いろいろ設定を変えてみたのですが、なぜか、「ブログ記事」と「ブログ記事リスト」で動きが異なったり、何か、プラグインの動作に問題があるような感じがしました。
そこで、プラグインのコードを見てみることにしました。
今回使用したのは、v0.12 です。
その中の、「lib/CharsetEncoder.pm」に、問題になりそうな箇所を見つけました。
35行目と、162行目に、metaタグに、charsetをセットする文があります。

my $charset = ($encoding eq 'euc-jp') ? 'EUC-JP' : 'Shift_JIS' ;

「$encoding がeuc-jp でなければ、Shift-JIS にせよ」となっています。
つまり、せっかく $encoding に「cp932」がセットされていても、「Shift-JIS」にされてしまっているのです。
そこで、ここに条件分岐を加えて、
「$encoding がeuc-jp だったら、EUC-JP、
 違ったら、shift-jis なら、Shift-JIS、
 それも違ったら、Windows-31J」
というふうにしてみました。
(cp932という名前は、正式にはcharsetにセットする名前として認められていません。Windows-31J が正式なものです)
コードはこんなふうになります。
35行目と、162行目の2箇所とも、下記のように書き換えました。

my $charset = '' ;
if ($encoding eq 'euc-jp') {
$charset = 'EUC-JP' ;
} elsif ($encoding eq 'shift_jis') {
$charset = 'shift-JIS' ;
} else {
$charset = 'Windows-31J' ;
}

こうすることで、「~」は文字化けしなくなりました。
しかし!
今度は、Macintoshから入力した「〜」が「?」になってしまうのです。
つまり、
・charset=Shift-JIS → Winの「~」(~)が文字化け、Macの「〜」(〜)は正常
・charset=Windows-31J → Winの「~」(~)は正常、Macの「〜」(〜)は文字化け
というわけです。
文字コードをいろいろいじってみましたが、あちらを立てればこちらが立たずでどうしようもありません。
仕方がないので、両方を統一することにしました。
「~」も、「〜」も、「~」にしてしまいます。
下記のコードを、先ほどのコードの下に追加してやります。
(44行目)

$$html =~ s/[\x{FF5E}\x{301C}]/~/g;

(179行目)

$$output =~ s/[\x{FF5E}\x{301C}]/~/g;

管理画面上では、両方の「&#xFF5E」が混在していますが、出力されたHTMLを見てみると、数値参照に置換されています。
困っている方、ぜひ、お試しくださいな。

この記事を書いた人

川井 昌彦
川井 昌彦
FAシステムメーカー、国内最大手印刷会社製版部、印刷・ウェブ制作会社を経て、家庭の事情で実家に帰省して独立
現在はフリーランスと制作会社シニアディレクターのマルチワーク
ウェブ制作のほぼ全般を見渡せるディレクター業務が主だが、デザイン・コーディングも好き

1997年ブログ開設
WordPressコミュニティには2011年から参加
WordCamp Kansai 2016 セッションスピーカー
WordCamp Tokyo 2023 パネルディスカッションパネラー
WordBench京都、WordBench神戸、WordPress Meetup八王子など登壇多数

ご質問・ご相談などありましたら
お気軽にお問い合わせください


コメントを残す

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

Vektor Passport(ライセンス期間1年)
VK Filter Search Pro
Vektor WordPress Solutions
PAGE TOP