この記事では、smarty の中国語と英語のマルチエンコーディング文字の文字化けの問題の解決策を主に紹介します。必要な方は参考にしてください。
この記事では、Smarty の中国語と英語のマルチエンコーディングの例を説明し、文字化けと文字化けの問題の解決策を皆さんに共有します。具体的な方法は次のとおりです: 一般的な Web サイトのページの表示には、必然的に部分文字列のインターセプトが含まれます。このとき、truncate が便利ですが、中国語ユーザーの場合、truncate を使用すると文字化けが発生します。文字列、および中国語と英語が混在した文字列の場合、同じ数の文字列がインターセプトされると、実際の表示長が異なり、視覚的に不均一に見え、外観に影響を与えます。これは、漢字 1 文字の長さが英語 2 文字の長さにほぼ等しいためです。さらに、truncate は GB2312、UTF-8、および他のエンコーディングと同時に互換性がありません。改善されたsmartTruncate: ファイル名: modifier.smartTruncate.php
具体的なコードは次のとおりです:
<?php function smartDetectUTF8($string) { static $result = array(); if(! array_key_exists($key = md5($string), $result)) { $utf8 = " /^(?: [\x09\x0A\x0D\x20-\x7E] # ASCII | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 )+$/xs "; $result[$key] = preg_match(trim($utf8), $string); } return $result[$key]; } function smartStrlen($string) { $result = 0; $number = smartDetectUTF8($string) ? 3 : 2; for($i = 0; $i < strlen($string); $i += $bytes) { $bytes = ord(substr($string, $i, 1)) > 127 ? $number : 1; $result += $bytes > 1 ? 1.0 : 0.5; } return $result; } function smartSubstr($string, $start, $length = null) { $result = ''''; $number = smartDetectUTF8($string) ? 3 : 2; if($start < 0) { $start = max(smartStrlen($string) + $start, 0); } for($i = 0; $i < strlen($string); $i += $bytes) { if($start <= 0) { break; } $bytes = ord(substr($string, $i, 1)) > 127 ? $number : 1; $start -= $bytes > 1 ? 1.0 : 0.5; } if(is_null($length)) { $result = substr($string, $i); } else { for($j = $i; $j < strlen($string); $j += $bytes) { if($length <= 0) { break; } if(($bytes = ord(substr($string, $j, 1)) > 127 ? $number : 1) > 1) { if($length < 1.0) { break; } $result .= substr($string, $j, $bytes); $length -= 1.0; } else { $result .= substr($string, $j, 1); $length -= 0.5; } } } return $result; } function smarty_modifier_smartTruncate($string, $length = 80, $etc = ''...'', $break_words = false, $middle = false) { if ($length == 0) return ''''; if (smartStrlen($string) > $length) { $length -= smartStrlen($etc); if (!$break_words && !$middle) { $string = preg_replace(''/\s+?(\S+)?$/'', '''', smartSubstr($string, 0, $length+1)); } if(!$middle) { return smartSubstr($string, 0, $length).$etc; } else { return smartSubstr($string, 0, $length/2) . $etc . smartSubstr($string, -$length/2); } } else { return $string; } } ?>
上記のコードはtruncateの本来の機能を完全に実現しており、GB2312の両方と互換性があります。 UTF-8エンコーディングで文字長を判断する場合、中国語文字は1.0、英語文字は0.5としてカウントされるため、部分文字列をインターセプトする際にムラが発生しません。これは簡単なテストです:
コードは次のとおりです:
{$content|smartTruncate:5:".."}($content等于"A中B华C人D民E共F和G国H")
GB2312 エンコーディングまたは UTF-8 エンコーディングを使用しているかどうかに関係なく、結果が正しいことがわかります。これが、プラグイン名に「smart」という単語を追加した理由の 1 つです。 。