function mb_convert_case($str, $case, $encoding = '') { global $mbemu_internals; switch ($case) { case MB_CASE_UPPER: return mb_strtoupper($str, $encoding); case MB_CASE_LOWER: return mb_strtolower($str, $encoding); case MB_CASE_TITLE: include_once dirname(__FILE__) . '/upper.table'; include_once dirname(__FILE__) . '/lower.table'; $encoding = mb_detect_encoding($str, $encoding); $str = mb_convert_encoding($str, 'UTF-8', $encoding); $max = preg_match_all('/' . $mbemu_internals['regex'][4] . '/', $str, $allchars); // make array of chars $newst = ''; $isalpha = FALSE; for ($i = 0; $i < $max; ++$i) { $val = _utf8ucs2($allchars[0][$i]); //get ucs2 value if (0x41 <= $val && $val <= 0x5a) { if ($isalpha) { $val += 0x20; // to lower; } else { $isalpha = TRUE; } $newst .= _ucs2utf8($val); } elseif (0x61 <= $val && $val <= 0x7a) { if (!$isalpha) { $val -= 0x20; // to upper $isalpha = TRUE; } $newst .= _ucs2utf8($val); } elseif ($upper = $mbemu_internals['upperarray'][$val]) { // this char is lower if ($isalpha) { $newst .= _ucs2utf8($val); } else { $isalpha = TRUE; $newst .= _ucs2utf8($upper); } } elseif ($lower = $mbemu_internals['lowerarray'][$val]) { // this char is upper if ($isalpha) { $newst .= _ucs2utf8($lower); } else { $isalpha = TRUE; $newst .= _ucs2utf8($val); } } else { $isalpha = FALSE; $newst .= $allchars[0][$i]; } } return mb_convert_encoding($newst, $encoding, 'UTF-8'); } }
function mb_strimwidth($str, $start, $width, $trimmarker, $encoding = '') { global $_mb_encoding, $euc_match, $utf8_match, $sjis_match; $encoding = _get_encoding($str, $encoding); $str = mb_substr($str, $start, 'notnumber', $encoding); if (($len = mb_strwidth($str, $encoding)) <= $width) { return $str; } $trimwidth = mb_strwidth($trimmarker, $encoding); $width -= $trimwidth; if ($width <= 0) { return $trimmarker; } switch ($_mb_encoding[$encoding]) { case 1: //euc-jp preg_match_all("/{$euc_match}/", $str, $arr); $i = 0; while (TRUE) { if ($arr[1][$i]) { $width -= 2; } else { --$width; } if ($width < 0) { break; } ++$i; } $arr[0] = array_slice($arr[0], 0, $i); return implode("", $arr[0]) . $trimmarker; case 0: //ascii //ascii case 4: //utf-8 preg_match_all("/{$utf8_match}/", $str, $arr); $i = 0; while (TRUE) { $ucs2 = _utf8ucs2($arr[0][$i]); if (0x2000 <= $ucs2 && $ucs2 <= 0xff60 || 0xffa0 <= $ucs2) { $width -= 2; } else { --$width; } if ($width < 0) { break; } ++$i; } $arr[0] = array_slice($arr[0], 0, $i); return implode("", $arr[0]) . $trimmarker; case 2: //shift-jis preg_match_all("/{$sjis_match}/", $str, $arr); $i = 0; while (TRUE) { if ($arr[1][$i]) { $width -= 2; } else { --$width; } if ($width < 0) { break; } ++$i; } $arr[0] = array_slice($arr[0], 0, $i); return implode("", $arr[0]) . $trimmarker; case 3: //jis $str = mb_convert_encoding($str, 'SJIS', 'JIS'); $trimmarker = mb_convert_encoding($trimmarker, 'SJIS', 'JIS'); preg_match_all("/{$sjis_match}/", $str, $arr); $i = 0; while (TRUE) { if ($arr[1][$i]) { $width -= 2; } else { --$width; } if ($width < 0) { break; } ++$i; } $arr[0] = array_slice($arr[0], 0, $i); return mb_convert_encoding(implode("", $arr[0]) . $trimmarker, 'JIS', 'SJIS'); } }