PHP+Smartyで携帯サイトを制作すると絶対にぶつかる問題。
「文字コードの変換」
パソコン用であれば、「UTF-8」で統一しておけば何も問題ないのだが
携帯サイトに関しては、基本的に「SHIFT-JIS」
ドコモの一部機種とソフトバンクは、「UTF-8」対応しているが
auは対応しておらず、すべての携帯で見れる文字コードは
今のところ「SHIFT-JIS」のみ。
ただし、PHP+Smartyは「UTF-8」か「EUC」しか対応していないので
PHPは上記どちらかで保存し、ビュー用のテンプレートファイルを「SHIFT-JIS」で保存。
そして、アウトプットさせるデータを出力時に「SHIFT-JIS」にエンコード。
これでうまくいくはずが・・・文字コードはハマると結構面倒なんだなぁ(泣)
今回気がついたことは、エンコードの関数「mb_convert_encoding」って
配列に対応してないのね・・・(><)
ということで、多重配列に対応したエンコード関数を作ってみました。
これで携帯でうまく表示されました!
/* -------------------------------------------
文字列(配列)のエンコード
$param = ターゲットとなる配列もしくは文字列
$to_encoding = 変換後の文字コード
$from_encoding = 変換前の文字コード(デフォルトはauto)
------------------------------------------- */
function arr_mb_convert_encoding($param, $to_encoding, $from_encoding="auto"){
if(is_array($param)){
foreach($param as $key => $val){
if(is_array($val)){
foreach($val as $k => $v){
$param[$key][$k] = mb_convert_encoding($v, $to_encoding, $from_encoding);
}//end foreach
}else{
$param[$key] = mb_convert_encoding($val, $to_encoding, $from_encoding);
}//end if
}//end foreach
}else{
$param = mb_convert_encoding($param, $to_encoding, $from_encoding);
}//end if
return $param;
}//end function
「文字コードの変換」
パソコン用であれば、「UTF-8」で統一しておけば何も問題ないのだが
携帯サイトに関しては、基本的に「SHIFT-JIS」
ドコモの一部機種とソフトバンクは、「UTF-8」対応しているが
auは対応しておらず、すべての携帯で見れる文字コードは
今のところ「SHIFT-JIS」のみ。
ただし、PHP+Smartyは「UTF-8」か「EUC」しか対応していないので
PHPは上記どちらかで保存し、ビュー用のテンプレートファイルを「SHIFT-JIS」で保存。
そして、アウトプットさせるデータを出力時に「SHIFT-JIS」にエンコード。
これでうまくいくはずが・・・文字コードはハマると結構面倒なんだなぁ(泣)
今回気がついたことは、エンコードの関数「mb_convert_encoding」って
配列に対応してないのね・・・(><)
ということで、多重配列に対応したエンコード関数を作ってみました。
これで携帯でうまく表示されました!
/* -------------------------------------------
文字列(配列)のエンコード
$param = ターゲットとなる配列もしくは文字列
$to_encoding = 変換後の文字コード
$from_encoding = 変換前の文字コード(デフォルトはauto)
------------------------------------------- */
function arr_mb_convert_encoding($param, $to_encoding, $from_encoding="auto"){
if(is_array($param)){
foreach($param as $key => $val){
if(is_array($val)){
foreach($val as $k => $v){
$param[$key][$k] = mb_convert_encoding($v, $to_encoding, $from_encoding);
}//end foreach
}else{
$param[$key] = mb_convert_encoding($val, $to_encoding, $from_encoding);
}//end if
}//end foreach
}else{
$param = mb_convert_encoding($param, $to_encoding, $from_encoding);
}//end if
return $param;
}//end function

