とまと あんらいぷ…

エンジニアの活動記録とかつぶやきとか

GitHub
スポンサードリンク

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサードリンク

EC-CUBE(2.13系)商品名に環境依存文字(特殊文字)を入れるとメールが文字化けする

EC-CUBEというパッケージを使うことになって
商品名に環境依存文字を入れなければいけなかったのだけど
どうしてもメールが文字化けしてしまってたので対応した内容をメモ

EC-CUBEで特殊文字を使う方法


まず考えたのは商品名に文字実体参照を使うこと。
これは商品名に直接文字実体参照である®を書くことです。

こうすると、WEBサイト上でhtmlエンコーディングされてしまって
まんま®って出ます。
WEBサイトサイト上の見かけを変更するために

あらゆる商品出力時のテンプレートのコード

<!--{$arrProduct.name|h}-->

を探して「|h」を外してやれば良い。
これで、htmlエンコードがなくなって®って出ます。

文字化けはWEBサイトで起こってるんじゃない!メールで起こってるんだ!


というわけで一安心してたのですが
実際に商品名が使われる場所って
WEBサイト上だけじゃないんですよね。

・CSV出力
・メール送信
・出荷伝票(納品書)
・ヤマトB2なんて使ってるとヤマト用のCSVファイル

実際にメール送信する時に、メール本文が&reg;って表示されてしまいます。
文字コードめぇ・・・

非常に面倒なので、商品名は直接®指定にすることにしました。
最近のブラウザは文字自体参照使わなくても表示されますし・・・ゲフンゲフン

と、これでもまだメール送信時に®が?に化けている事が発覚!
またか・・・

EC-CUBEのメールは、iso-2022-jpという文字コードで送信されています。
ソースコードの場所は

data > class >> SC_SendMail.php

です。ここで

setSubject()やsetBody()を見てみると

$this->body = mb_convert_encoding($body, 'JIS', CHAR_CODE);

が設定されています。
JISでは®を扱えないので
これを

$this->body = mb_convert_encoding($body, "UTF-8", CHAR_CODE);

に変更。

このままだと、Outlookなどお馬鹿なメールソフトだと
メールヘッダと本文の文字コードの乖離が出てしまってまたもや文字化けします。

なのでメールヘッダーの"Content-Type"も正しく設定します。

getTEXTHeader()とgetHTMLHeader()を確認。

$arrHeader['Content-Type'] = 'text/plain; charset="ISO-2022-JP"';
$arrHeader['Content-Type'] = 'text/html; charset="ISO-2022-JP"';

となっているところを
それぞれ
$arrHeader['Content-Type'] = 'text/plain; charset="utf-8"';
$arrHeader['Content-Type'] = 'text/html; charset="utf-8"';

に変更。

正攻法は、サイトシステム全体の文字コードを見直すことなのですが
手間ですしね・・・
CSVファイルも®で出力されていますし。多分運用上耐えれるでしょう。

2014/04/26時点で唯一の2.13系対応のEC-CUBE公式ガイドブックです。
手探りでコード修正を行ってる方は必見

▼この記事を読んだ方は、こんな記事も読んでいます。▼

スポンサードリンク

テーマ:プログラミング - ジャンル:コンピュータ

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://dalmore.blog7.fc2.com/tb.php/105-55882ccf
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。