21 private static $mechs = [
'ucs4',
'ucs4array',
'utf8',
'utf7',
'utf7imap'];
45 if (self::$safe_mode) {
46 self::$allow_overlong =
true;
48 if (!in_array($from, self::$mechs)) {
49 throw new \InvalidArgumentException(sprintf(
'Invalid input format %s', $from));
51 if (!in_array($to, self::$mechs)) {
52 throw new \InvalidArgumentException(sprintf(
'Invalid output format %s', $to));
54 if ($from !=
'ucs4array') {
55 $methodName = $from .
'_ucs4array';
56 $data = self::$methodName($data);
58 if ($to !=
'ucs4array') {
59 $methodName =
'ucs4array_' . $to;
60 $data = self::$methodName($data);
75 $start_byte = $next_byte = 0;
82 for ($k = 0; $k < $inp_len; ++$k) {
89 if (self::$safe_mode) {
93 throw new \InvalidArgumentException(sprintf(
'Conversion from UTF-8 to UCS-4 failed: malformed input at byte %d', $k));
98 if (
'next' == $mode) {
104 $v = ($v - 192) << 6;
105 } elseif ($v >> 4 == 14) {
107 $v = ($v - 224) << 12;
108 } elseif ($v >> 3 == 30) {
110 $v = ($v - 240) << 18;
111 } elseif (self::$safe_mode) {
117 throw new \InvalidArgumentException(sprintf(
'This might be UTF-8, but I don\'t understand it at byte %d', $k));
119 if ($inp_len - $k - $next_byte < 2) {
125 if (
'add' == $mode) {
131 if (
'add' == $mode) {
132 if (!self::$allow_overlong && $test ==
'range') {
134 if (($v < 0xA0 && $start_byte == 0xE0) || ($v < 0x90 && $start_byte == 0xF0) || ($v > 0x8F && $start_byte == 0xF4)) {
135 throw new \InvalidArgumentException(sprintf(
'Bogus UTF-8 character detected (out of legal range) at byte %d', $k));
139 $v = ($v - 128) << ($next_byte * 6);
143 if (self::$safe_mode) {
144 $output[$out_len - 1] = ord(self::$safe_char);
149 throw new \InvalidArgumentException(sprintf(
'Conversion from UTF-8 to UCS-4 failed: malformed input at byte %d', $k));
151 if ($next_byte < 0) {
169 foreach ($input as $k => $v) {
172 } elseif ($v < (1 << 11)) {
173 $output .= chr(192 + ($v >> 6)) . chr(128 + ($v & 63));
174 } elseif ($v < (1 << 16)) {
175 $output .= chr(224 + ($v >> 12)) . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63));
176 } elseif ($v < (1 << 21)) {
177 $output .= chr(240 + ($v >> 18)) . chr(128 + (($v >> 12) & 63)) . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63));
178 } elseif (self::$safe_mode) {
181 throw new \InvalidArgumentException(sprintf(
'Conversion from UCS-4 to UTF-8 failed: malformed input at byte %d', $k));
201 for ($k = 0; $k < $inp_len; ++$k) {
210 if (!preg_match(
'![A-Za-z0-9/' . preg_quote($sc,
'!') .
']!', $c)) {
220 $tmp = base64_decode($b64);
221 $tmp = substr($tmp, -1 * (strlen($tmp) % 2));
222 for ($i = 0; $i < strlen($tmp); $i++) {
224 $output[$out_len] += ord($tmp{$i});
227 $output[$out_len] = ord($tmp{$i}) << 8;
253 return str_replace(
'/',
',', self::ucs4array_utf7($input,
'&'));
262 $v = (!empty($input)) ? array_shift($input) :
false;
263 $is_direct = (
false !== $v) ? (0x20 <= $v && $v <= 0x7e && $v != ord($sc)) :
true;
266 if ($b64 == chr(0) . $sc) {
270 $output .= $sc . str_replace(
'=',
'', base64_encode($b64)) .
'-';
274 } elseif (
false !== $v) {
275 $b64 .= chr(($v >> 8) & 255) . chr($v & 255);
278 if ($mode ==
'd' &&
false !== $v) {
282 $b64 = chr(($v >> 8) & 255) . chr($v & 255);
286 if (
false === $v && $b64 ==
'') {
302 foreach ($input as $v) {
303 $output .= chr(($v >> 24) & 255) . chr(($v >> 16) & 255) . chr(($v >> 8) & 255) . chr($v & 255);
321 throw new \InvalidArgumentException(
'Input UCS4 string is broken');
328 for ($i = 0, $out_len = -1; $i < $inp_len; ++$i) {
333 $output[$out_len] += ord($input{$i}) << (8 * (3 - ($i % 4)));
348 if ((extension_loaded(
'mbstring') && (ini_get(
'mbstring.func_overload') & 0x02) === 0x02)) {
349 return mb_strlen($string,
'8bit');
351 return strlen((binary)$string);