ホームページ  >  記事  >  バックエンド開発  >  GB2312 php Smarty が文字化けする gb2312/utf-8 の問題をインターセプトします。

GB2312 php Smarty が文字化けする gb2312/utf-8 の問題をインターセプトします。

WBOY
WBOYオリジナル
2016-07-29 08:47:14922ブラウズ

一般的な Web サイトのページを表示するには、必然的に部分文字列のインターセプトが必要になりますが、これは英語のユーザーにのみ適しています。また、中国語と英語が混在するユーザーの場合は、truncate を使用すると文字化けが発生します。同じ数の文字列をインターセプトした場合、実際の表示長は異なりますが、視覚的には不均一に見え、画像は美しくなります。これは、漢字 1 文字の長さが英語 2 文字の長さにほぼ等しいためです。さらに、truncate は GB2312、UTF-8、および他のエンコーディングと同時に互換性がありません。
改善されたsmartTruncate: ファイル名: modifier.smartTruncate.php

コードをコピー コードは次のとおりです:


function SmartDetectUTF8($string)
{
static $result = array() ;
if(! array_key_exists($key = md5($string), $result))
{
$utf8 = "
/^(?:
[x09x0Ax0Dx20-x7E] # ASCII
| [xC2-xDF][x80] -xBF ] # 非長すぎる 2 バイト
| x9F][x80-xBF] # サロゲートを除く
| }
return $result[$key]
$結果 = 0;
$number = スマート検出UTF8($string) ? 3 : 2;
for($i {
$bytes = ord (substr($string, $i, 1)) > $number : 1;
$result;
関数文字列、$start、$length = null)
{
$result = '';
$number = SmartDetectUTF8($string ) 3 : 2;
if($start $start = max(スマートS​​trlen($string) + $start, 0);
}
for($i = 0; $i {
if($start {
}
$bytes = ord($string, $i, 1) > $number : 1;
$start -= 1.0 : 0.5;
if(is_null($length))
{
$result = substr($string, $i);
}
else
{
for($j = $i; $j < strlen($string); $j += $bytes)
{
if($length {
break;
}
if(($bytes = ord(substr($string, $j, 1)) > 127 ? $number : 1) > 1)
{
if($length {
break;
}
$result .= substr($string, $j, $bytes); ;
}
else
{
$result .= substr($string, $j, 1);
}
}
return $result($string, $length = 80, $etc = '...',
$break_words = false, $middle = false)
{
if ($length == 0)
return ''; ; $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) .smartSubstr($string, -$length/2);
}
}


上記のコードは、 truncate の独自機能で、GB2312 と UTF-8 の両方のエンコーディングに対応しており、文字長を判定する際に漢字 1 文字を 1.0、英語 1 文字を 0.5 としてカウントするため、部分文字列の切り出しにムラがありません。
プラグインの使用方法については特別なことは何もありません。簡単なテストを次に示します:
{$content|smartTruncate:5: ".."} ($content は "A China B China C People D People E共産党FとG国H")
表示: A 中国 B 中国 C.. (中国語記号の長さを 1.0 としてカウントし、英語記号の長さを 0.5 としてカウントし、省略された記号の長さを考慮します)
GB2312 エンコードを使用しても UTF-8 エンコードを使用しても、結果が正しいことがわかります。これが、プラグイン名に「smart」という単語を追加した理由の 1 つです。
GB2312 php Smarty? gb2312/utf-8 で文字化けが発生する問題について、GB2312 の内容も含めて紹介しました。PHP チュートリアルに興味のある友人の参考になれば幸いです。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。