PHP(euc) + Smarty(euc) で、UTF-8やSJIS出力する方法(解決策とまとめ)
来源:互联网 发布:千本樱动作数据 编辑:程序博客网 时间:2024/05/22 02:03
PHP(euc) + Smarty(euc) で、UTF-8やSJIS出力する方法(解決策とまとめ)
转自: http://www.thekyo.jp/tech/2007/02/phpeuc_smartyeuc_utf8sjis.html
以前ハマった、PHP+SmartyでのUTF-8出力のまとめのメモ。
SJISなども置き換えて処理させれば、動作確認済み。もちろん、mb_internal_encodingがUTF-8の環境での、SJIS出力やEUC-JP出力も対応。
ってことで、メモ。
PHP(euc) + Smarty(euc) で、UTF-8やSJIS出力する方法(解決策とまとめ)
ここでは、PHPのとSmartyテンプレートのエンコードをeucとしてますが、PHP = Smartyテンプレートとして読み替えれば、どんな文字コードでもOKのはず。
一応、同一スクリプトで文字コードの変換出力部分をテストした時のサンプルソースを貼っておきます。
サーバー環境
PHP 4.4.4
mbstring.detect_order: autombstring.encoding_translation: Offmbstring.func_overload: 0(none)mbstring.http_input: autombstring.http_output: euc-jpmbstring.internal_encoding: euc-jpmbstring.language: Japanesembstring.script_encoding: no valuembstring.substitute_character: no value
Smarty テンプレート(euc)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html lang="ja"><head><meta http-equiv="content-type" content="text/html; charset={$data.html_output}"><title>{$data.html_title}</title></head><body> <div> テンプレート内に直接記載 </div> <br> <br> <div> {* この値をcontent-typeへ指定 *} PHPからセット -> {$data.html_output}(このHTMLのcharset)<br> {* PHP内部で指定した文字列 *} PHPからセット -> {$data.comment|nl2br}<br> {* formからPOSTされた文字列 *} PHPからセット -> {$data.form}(フォームから取得) </div> <br> <div> <form action="#" method="post"> <input type="text" name="comment" value=""><br> <input type="submit" value=" OK "> </form> </div> <br> <div> <fieldset> <a href="?charset=shift_jis">SJIS</a><br> <a href="?charset=euc-jp">EUC-JP</a><br> <a href="?charset=utf-8">UTF-8</a><br> </fieldset> </div></body></html>
UTF-8/SJIS/EUC-JP 出力テストサンプル(euc)
<?php/** * PHP(euc) + Smarty(euc) 環境での他文字コード出力テスト **//* input charset */ // key(HTML META内charset) value:mb_convert_encodingパラメータ(JIS,SJIS,EUC-JP,UTF-8) $list_charset = array( 'shift_jis' => 'SJIS', 'euc-jp' => 'EUC-JP', 'utf-8' => 'UTF-8', ); $output_charset = get_output_charset(); $conv_charset = get_charset();/* content header */ header('content-type:text/html; charset="$output_charset"');/* smarty setting*/ require_once('Smarty/Smarty.class.php'); $smarty = new Smarty(); $smarty->template_dir = './'; $smarty->compile_dir = './templates_c/';/* template(encode) == php(encode) */ $smarty->register_outputfilter("output_filter");/* values for smarty template */ $data['html_title'] = 'タイトル←PHPから指定'; $data['html_output'] = $output_charset; if( isset($_POST['comment']) ){ $data['form'] = htmlspecialchars(mb_convert_encoding($_POST['comment'], mb_internal_encoding(), $conv_charset)); } $data['comment'] = 'PHP側からデータをセット♪';/* smarty assign */ $smarty->assign('data', $data);/* smarty display */ $smarty->display("pc_index.tpl");//{{{ output_filter/* Smarty->display()時に処理されるフィルタ(outputfilter) */function output_filter($buff, &$smarty){ $conv_charset = get_charset(); if (function_exists("mb_convert_encoding")) { $enc = mb_detect_encoding($buff); if ($enc != $conv_charset ) { $buff = mb_convert_encoding($buff, $conv_charset, 'EUC-JP'); /* コード変換が分かりにくいので、一応出力 */ } } return $buff. "template:$enc<br>output:$conv_charset";}//}}}//{{{ get_output_charset/* $list_charsetから出力用(content-header)の文字コードを取得 */function get_output_charset(){ global $list_charset; if( isset($_GET['charset']) ){ $charset = htmlspecialchars($_GET['charset']); if( array_key_exists($charset, $list_charset) ){ return $charset; } } return strtolower(mb_internal_encoding());}//}}}//{{{ get_charset/* $list_charsetから文字コード変換用(mb_convert_encoding)の文字コードを取得 */function get_charset(){ global $list_charset, $conv_charset; if( isset($_GET['charset']) ){ $charset = htmlspecialchars($_GET['charset']); if( in_array($charset, $list_charset) ){ return $list_charset[$charset]; }else{ //return mb_internal_encoding(); return $charset; } }else{ return $charset; }}//}}}
まとめ
mb_internal_encoding(PHP) = Smartyテンプレート
PHPのエンコードとSmartyテンプレートが同じ文字コードの場合(例:EUC-JP)
- outputfilterでUTF-8化処理する
- header()を使って、content-typeを必ず指定(ここではUTF-8)
- GET/POSTデータをそのままテンプレート内に入れると、mb_detect_encoding()がテンプレートを処理できなくなる場合があるので、GET,POST(多分Cookieなども)されるデータはmb_convert_encoding()を使ってEUCへ
mb_internal_encoding(PHP) != Smartyテンプレート
PHPのエンコードとSmartyテンプレートが異なる文字コードの場合(例:テンプレート = UTF-8)
(試してませんが・・・おそらく)
- テンプレートコンパイル前にprefilter()でEUC-JP化処理する
- テンプレートコンパイル後にpostfilter()でUTF-8化処理する
- header()を使って、content-typeを必ず指定(ここではUTF-8)
- GET,POST(多分Cookieなども)されるデータはそのまま使えるはず
今回はまったのは、header()のとこなんですが、結局[ templates_c ]内をちゃんと削除できてなかったらしく、正しく処理してるのに「あれ?」って感じで修正入れて・・・・無限ループ状態だったようです。
こういう時に客観的な目とか慎重さがあればなぁ・・と反省_| ̄|○
- PHP(euc) + Smarty(euc) で、UTF-8やSJIS出力する方法(解決策とまとめ)
- ShiftJis码->UTF-8, EUC码->JIS码
- EUC-JP 正则
- EUC-CN是什么编码
- 日文EUC编码中的S90和U90
- 来率先介绍EUC相关的产品线
- 日文euc-jp编码转换——谈codepage 51932
- JIS,SHIFT-JIS,EUC-JP(日文编码简述)
- eclipse查看euc-jp编码格式的文件
- euc-kr编码中文下乱码解决方案,idhttp
- VisualforceでCSVファイルとExcelファイルを出力するには
- Eclipseのエンコード(euc)設定
- [Erlang 0063] Joe Armstrong 《A Few Improvements to Erlang》EUC 2012
- Solaris 11(x86)安装后不能使用中文EUC的问题
- ■ 国際化対応フォーマット、パターン文字フォーマットで日付を出力する方法
- php smarty区域循环方法
- FZCCHJW--GB1-0-GBpc-EUC-H:在系统中未找到字体;已替换缺少的字体。
- PHP Smarty实例教程(二):smarty安装配置路径方法
- MSDE 与 SQL SERVER 最主要的区别是
- 无法打开 libboost_regex-vc90-mt-gd-1_44.lib
- 无法打开 libboost_regex-vc90-mt-gd-1_44.lib
- (索爱E15i/X8) app2sd应该注意的问题
- 什么是exploit
- PHP(euc) + Smarty(euc) で、UTF-8やSJIS出力する方法(解決策とまとめ)
- 用mfc画三角形
- 排序
- 解决mysql 添加插件时提示 ERROR 1289 (HY000): The ‘plugin’ feature is disabled; you need MySQL built with ‘HAVE_DLOPEN&#
- How to install masterpage,pagelayout,CSS,JS and images through Feature
- android 定位位置后怎么实现在在标记上显示信息窗口?
- Ubuntu操作系统安装使用教程
- TCP TIME_WAIT状态
- MFC中复选框 checkbox