OSDN Git Service

Remove charset selector, use UTF-8
[pukiwiki/pukiwiki.git] / lib / mbstring.php
1 <?php
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
6 //
7 // mbstring-extension alternate functions
8 // (will work with LANG == 'ja' and EUC-JP environment only)
9
10 /*
11  * mbstring extension がサーバー側に存在しない時の代替関数
12  *
13  * 注意事項
14  *
15  * 1. 実際に漢字コード変換を行わせるためには、別途 jcode.php
16  *    (TOMO作)をインストールする必要があります。
17  *
18  *   http://www.spencernetwork.org/jcode/ よりjcodeを入手し、
19  *   以下の様に展開してください。
20  *
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--
28  *
29  * 2. EUC-JP専用です。(出力されるデータがEUC-JPである必要があります)
30  *
31  */
32
33 // jcodeの所在
34 define('JCODE_DIR', './jcode_1.34/');
35 define('JCODE_FILE', JCODE_DIR . 'jcode_wrapper.php');
36
37 if (is_readable(JCODE_FILE)) {
38         require_once(JCODE_FILE);
39 }
40
41 // jcodeが存在しない場合、マルチバイト文字や漢字コードを扱えない
42 if (! function_exists('jcode_convert_encoding')) {
43
44 //      die_message('Multibyte functions cannot be used. Please read "mbstring.php" for an additional installation procedure of "jcode".');
45
46         function jstrlen($str)
47         {
48                 return strlen($str);
49         }
50
51         function jsubstr($str, $start, $length)
52         {
53                 return substr($str, $start, $length);
54         }
55
56         function AutoDetect($str)
57         {
58                 return 0;
59         }
60
61         function jcode_convert_encoding($str, $to_encoding, $from_encoding)
62         {
63                 return $str;
64         }
65 }
66
67 // mb_convert_encoding -- 文字エンコーディングを変換する
68 function mb_convert_encoding($str, $to_encoding, $from_encoding = '')
69 {
70         // 拡張: 配列を受けられるように
71         // mb_convert_variable対策
72         if (is_array($str)) {
73                 foreach ($str as $key=>$value) {
74                         $str[$key] = mb_convert_encoding($value, $to_encoding, $from_encoding);
75                 }
76                 return $str;
77         }
78         return jcode_convert_encoding($str, $to_encoding, $from_encoding);
79 }
80
81 // mb_convert_variables -- 変数の文字コードを変換する
82 function mb_convert_variables($to_encoding, $from_encoding, &$vars)
83 {
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));
88
89         if ($from_encoding != 'ASCII' && $from_encoding != SOURCE_ENCODING)
90                 $vars = mb_convert_encoding($vars, $to_encoding, $from_encoding);
91
92         return $from_encoding;
93 }
94
95 // 補助関数:配列を再帰的にjoinする
96 function join_array($glue, $pieces)
97 {
98         $arr = array();
99         foreach ($pieces as $piece) {
100                 $arr[] = is_array($piece) ? join_array($glue, $piece) : $piece;
101         }
102         return join($glue, $arr);
103 }
104
105 // mb_detect_encoding -- 文字エンコーディングを検出する
106 function mb_detect_encoding($str, $encoding_list = '')
107 {
108         static $codes = array(0=>'ASCII', 1=>'EUC-JP', 2=>'SJIS', 3=>'JIS', 4=>'UTF-8');
109
110         // 注: $encoding_listは使用しない。
111         $code = AutoDetect($str);
112         if (! isset($codes[$code])) $code = 0; // oh ;(
113
114         return $codes[$code];
115 }
116
117 // mb_detect_order --  文字エンコーディング検出順序の設定/取得
118 function mb_detect_order($encoding_list = NULL)
119 {
120         static $list = array();
121
122         // 注: 他の関数に影響を及ぼさない。呼んでも無意味。
123         if ($encoding_list === NULL) return $list;
124
125         $list = is_array($encoding_list) ? $encoding_list : explode(',', $encoding_list);
126         return TRUE;
127 }
128
129 // mb_encode_mimeheader -- MIMEヘッダの文字列をエンコードする
130 function mb_encode_mimeheader($str, $charset = 'ISO-2022-JP', $transfer_encoding = 'B', $linefeed = "\r\n")
131 {
132         // 注: $transfer_encodingに関わらずbase64エンコードを返す
133         $str = mb_convert_encoding($str, $charset, 'auto');
134         return '=?' . $charset . '?B?' . $str;
135 }
136
137 // mb_http_output -- HTTP出力文字エンコーディングの設定/取得
138 function mb_http_output($encoding = '')
139 {
140         return SOURCE_ENCODING; // 注: 何もしない
141 }
142
143 // mb_internal_encoding --  内部文字エンコーディングの設定/取得
144 function mb_internal_encoding($encoding = '')
145 {
146         return SOURCE_ENCODING; // 注: 何もしない
147 }
148
149 // mb_language --  カレントの言語を設定/取得
150 function mb_language($language = NULL)
151 {
152         static $mb_language = FALSE;
153
154         if ($language === NULL) return $mb_language;
155         $mb_language = $language;
156
157         return TRUE; // 注: 常にTRUEを返す
158 }
159
160 // mb_strimwidth -- 指定した幅で文字列を丸める
161 function mb_strimwidth($str, $start, $width, $trimmarker = '', $encoding = '')
162 {
163         if ($start == 0 && $width <= strlen($str)) return $str;
164
165         // 注: EUC-JP専用, $encodingを使用しない
166         $chars = unpack('C*', $str);
167         $substr = '';
168
169         while (! empty($chars) && $start > 0) {
170                 --$start;
171                 if (array_shift($chars) >= 0x80)
172                         array_shift($chars);
173         }
174         if ($b_trimmarker = (count($chars) > $width)) {
175                 $width -= strlen($trimmarker);
176         }
177         while (! empty($chars) && $width-- > 0) {
178                 $char = array_shift($chars);
179                 if ($char >= 0x80) {
180                         if ($width-- == 0) break;
181                         $substr .= chr($char);
182                         $char = array_shift($chars);
183                 }
184                 $substr .= chr($char);
185         }
186         if ($b_trimmarker) $substr .= $trimmarker;
187
188         return $substr;
189 }
190
191 // mb_strlen -- 文字列の長さを得る
192 function mb_strlen($str, $encoding = '')
193 {
194         // 注: EUC-JP専用, $encodingを使用しない
195         return jstrlen($str);
196 }
197
198 // mb_substr -- 文字列の一部を得る
199 function mb_substr($str, $start, $length = NULL, $encoding = '')
200 {
201         // 注: EUC-JP専用, $encodingを使用しない
202         return jsubstr($str, $start, ($length === NULL) ? jstrlen($str) : $length);
203 }
204 ?>