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: auto
mbstring.encoding_translation: Off
mbstring.func_overload: 0(none)
mbstring.http_input: auto
mbstring.http_output: euc-jp
mbstring.internal_encoding: euc-jp
mbstring.language: Japanese
mbstring.script_encoding: no value
mbstring.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出力する方法(解決策とまとめ)相关推荐

  1. php smarty模板配置,Smarty模板简单配置与使用方法示例

    这篇文章主要介绍了Smarty模板简单配置与使用方法,涉及Smarty模板的基本配置与缓存文件的相关使用技巧,需要的朋友可以参考下 本文实例讲述了Smarty模板简单配置与使用方法.分享给大家供大家参 ...

  2. php smarty php函数,smarty中使用php函数的方法

    本节内容: 如何在smarty中使用php函数? 例子: 复制代码 代码示例: /** * smarty模板引擎中使用php函数 * by www.jbxue.com */ require 'libs ...

  3. php smarty if,php Smarty中if,elseif,else用法详解

    php Smarty模板条件选择结构if-elseif-else,{if}必须和{/if}成对出现,当然也可以使用{else}和{elseif}子句,{if}中可以使用如下修饰词: if实例 {if} ...

  4. php smarty变量调节器,Smarty模板变量与调节器实例详解

    本文实例讲述了Smarty模板变量与调节器.分享给大家供大家参考,具体如下: Smarty中assign说明 可能有人在学习smarty的时候已经学习了一些php框架,如tp.laravel.Yii等 ...

  5. 【PHP】月末・月初の出力方法

    文章出处 : Qiita - http://qiita.com/shoridevel/items/0a2f4a64e55d84919a1c 今月の月初 echo date("Y-m-01&q ...

  6. java输出和读取CSV格式文件

    JavaでCSVファイルを出力する方法をていねいに解説! 输出CSV文件 package cn.itcast.mybatis.test;import java.io.BufferedWriter; i ...

  7. Velocity ユーザガイド

    このガイドについて Velocity ユーザガイドは.ページデザイナやコンテンツ・プロパイダに Velocity と. Velocity の単純ながらも強力なスクリプト言語である Velocity テ ...

  8. php 视图层smarty,4. 视图引擎 View Engine - Smarty

    帮助我们实现View的开发. 好的视图引擎: 模板更加贴近标准的html 语法简单易懂 良好的缓存机制 扩展性良好 网络资源多 现在市面上有Smarty和PHPLIB.我们将就Smarty进行深入了解 ...

  9. Smarty 显示大括号 | 在Smarty中计算数组元素的长度 | Smarty字符串拼接

    参考链接:http://hi.baidu.com/bdusnb/item/289d160e6a9c92cd9157183d 参考链接:http://hi.baidu.com/mayimu789/ite ...

  10. smarty模板基础

    入口文件 <?phpdefine("ROOT",str_replace("\\","/",dirname(__FILE__)).'/' ...

最新文章

  1. 硬核!我的导师手写129页毕业论文,堪比打印!
  2. IntelliJ IDEA的Maven项目在修改时报java.lang.OutOfMemoryError: PermGen space异常
  3. 小程序 video 控制器外观调整_「小程序JAVA实战」小程序视频组件与api介绍(51)...
  4. uboot 详细注释讲解
  5. HTML显示xml中的CDATA内容
  6. Symbian编程总结-图形图像篇-直接屏幕访问
  7. [C++STL]C++实现stack容器适配器
  8. SRTP参数及数据包处理过程
  9. Boost Graph Library 快速入门
  10. 时隔两年,PuTTY 喜提新版
  11. NYOJ--91--阶乘之和
  12. jedate插件的使用
  13. HTML——添加网页背景音乐
  14. Python数据挖掘-文本挖掘
  15. 计算机软考笔试知识点,计算机软考考试必备知识点:关键链法
  16. NWDS部署安装XPI Inspector
  17. easypoi 批量导出_浅谈easypoi快速实现excel批量导入
  18. PenTesters框架(PTF)
  19. 北斗终端与计算机传输信息,基于北斗信息的手机终端的应用研究
  20. numpy 三角函数 sin()、cos()、tan() 反三角函数arcsin,arccos,arctan numpy.degrees()

热门文章

  1. 洛谷:P1330 封锁阳光大学(二分图染色 + 最小同色点覆盖)
  2. Android自定义View画钟表
  3. linux网卡驱动rtl8188cu,Realtek RTL8188CU芯片无线网卡的Linux驱动安装
  4. python图片镜像翻转_OpenCV Python 翻转(镜像)图片 cv.flip
  5. 牛客面试必刷101代码总结【python】
  6. 智协云店通+BitCOO扶持TEAx加入4WiN.io全球互贸链 | 翼次元空间+Fund++
  7. <POSTGRESQL修炼之道:从小工到专家>之逻辑结构管理(1-5节)
  8. Color颜色——颜色模式、颜色基本特征、网页颜色以及其代码
  9. 通过注册表禁用系统服务
  10. 基于STM32的多功能MP3设计 毕业设计(论文)文献综述