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