2 // PukiWiki - Yet another WikiWikiWeb clone.
3 // $Id: mbstring.php,v 1.4 2005/04/29 11:24:20 henoheno Exp $
4 // Copyright (C) 2003-2005 PukiWiki Developers Team
5 // License: GPL v2 or (at your option) any later version
7 // mbstring-extension alternate functions
8 // (will work with LANG == 'ja' and EUC-JP environment only)
11 * mbstring extension がサーバー側に存在しない時の代替関数
15 * 1. 実際に漢字コード変換を行わせるためには、別途 jcode.php
16 * (TOMO作)をインストールする必要があります。
18 * http://www.spencernetwork.org/jcode/ よりjcodeを入手し、
21 * -+--- mbstring.php -r--
22 * +-+- jcode_1.34/ dr-x
23 * +--- readme.txt -r--
24 * +--- jcode.phps -r--
25 * +--- jcode_wrapper.php -r--
26 * +--- code_table.ucs2jis -r--
27 * +--- code_table.jis2ucs -r--
29 * 2. EUC-JP専用です。(出力されるデータがEUC-JPである必要があります)
34 define('JCODE_DIR', './jcode_1.34/');
35 define('JCODE_FILE', JCODE_DIR . 'jcode_wrapper.php');
37 if (is_readable(JCODE_FILE)) {
38 require_once(JCODE_FILE);
41 // jcodeが存在しない場合、マルチバイト文字や漢字コードを扱えない
42 if (! function_exists('jcode_convert_encoding')) {
44 // die_message('Multibyte functions cannot be used. Please read "mbstring.php" for an additional installation procedure of "jcode".');
46 function jstrlen($str)
51 function jsubstr($str, $start, $length)
53 return substr($str, $start, $length);
56 function AutoDetect($str)
61 function jcode_convert_encoding($str, $to_encoding, $from_encoding)
67 // mb_convert_encoding -- 文字エンコーディングを変換する
68 function mb_convert_encoding($str, $to_encoding, $from_encoding = '')
71 // mb_convert_variable対策
73 foreach ($str as $key=>$value) {
74 $str[$key] = mb_convert_encoding($value, $to_encoding, $from_encoding);
78 return jcode_convert_encoding($str, $to_encoding, $from_encoding);
81 // mb_convert_variables -- 変数の文字コードを変換する
82 function mb_convert_variables($to_encoding, $from_encoding, &$vars)
84 // 注: 可変長引数ではない。init.phpから呼ばれる1引数のパターンのみをサポート
85 // 正直に実装するなら、可変引数をリファレンスで受ける方法が必要
86 if (is_array($from_encoding) || $from_encoding == '' || $from_encoding == 'auto')
87 $from_encoding = mb_detect_encoding(join_array(' ', $vars));
89 if ($from_encoding != 'ASCII' && $from_encoding != SOURCE_ENCODING)
90 $vars = mb_convert_encoding($vars, $to_encoding, $from_encoding);
92 return $from_encoding;
96 function join_array($glue, $pieces)
99 foreach ($pieces as $piece) {
100 $arr[] = is_array($piece) ? join_array($glue, $piece) : $piece;
102 return join($glue, $arr);
105 // mb_detect_encoding -- 文字エンコーディングを検出する
106 function mb_detect_encoding($str, $encoding_list = '')
108 static $codes = array(0=>'ASCII', 1=>'EUC-JP', 2=>'SJIS', 3=>'JIS', 4=>'UTF-8');
110 // 注: $encoding_listは使用しない。
111 $code = AutoDetect($str);
112 if (! isset($codes[$code])) $code = 0; // oh ;(
114 return $codes[$code];
117 // mb_detect_order -- 文字エンコーディング検出順序の設定/取得
118 function mb_detect_order($encoding_list = NULL)
120 static $list = array();
122 // 注: 他の関数に影響を及ぼさない。呼んでも無意味。
123 if ($encoding_list === NULL) return $list;
125 $list = is_array($encoding_list) ? $encoding_list : explode(',', $encoding_list);
129 // mb_encode_mimeheader -- MIMEヘッダの文字列をエンコードする
130 function mb_encode_mimeheader($str, $charset = 'ISO-2022-JP', $transfer_encoding = 'B', $linefeed = "\r\n")
132 // 注: $transfer_encodingに関わらずbase64エンコードを返す
133 $str = mb_convert_encoding($str, $charset, 'auto');
134 return '=?' . $charset . '?B?' . $str;
137 // mb_http_output -- HTTP出力文字エンコーディングの設定/取得
138 function mb_http_output($encoding = '')
140 return SOURCE_ENCODING; // 注: 何もしない
143 // mb_internal_encoding -- 内部文字エンコーディングの設定/取得
144 function mb_internal_encoding($encoding = '')
146 return SOURCE_ENCODING; // 注: 何もしない
149 // mb_language -- カレントの言語を設定/取得
150 function mb_language($language = NULL)
152 static $mb_language = FALSE;
154 if ($language === NULL) return $mb_language;
155 $mb_language = $language;
157 return TRUE; // 注: 常にTRUEを返す
160 // mb_strimwidth -- 指定した幅で文字列を丸める
161 function mb_strimwidth($str, $start, $width, $trimmarker = '', $encoding = '')
163 if ($start == 0 && $width <= strlen($str)) return $str;
165 // 注: EUC-JP専用, $encodingを使用しない
166 $chars = unpack('C*', $str);
169 while (! empty($chars) && $start > 0) {
171 if (array_shift($chars) >= 0x80)
174 if ($b_trimmarker = (count($chars) > $width)) {
175 $width -= strlen($trimmarker);
177 while (! empty($chars) && $width-- > 0) {
178 $char = array_shift($chars);
180 if ($width-- == 0) break;
181 $substr .= chr($char);
182 $char = array_shift($chars);
184 $substr .= chr($char);
186 if ($b_trimmarker) $substr .= $trimmarker;
191 // mb_strlen -- 文字列の長さを得る
192 function mb_strlen($str, $encoding = '')
194 // 注: EUC-JP専用, $encodingを使用しない
195 return jstrlen($str);
198 // mb_substr -- 文字列の一部を得る
199 function mb_substr($str, $start, $length = NULL, $encoding = '')
201 // 注: EUC-JP専用, $encodingを使用しない
202 return jsubstr($str, $start, ($length === NULL) ? jstrlen($str) : $length);