原理は非常に単純です。gb2312/gbk は中国語の 2 バイトであり、これらの 2 バイトには値の範囲がありますが、utf-8 の中国語の文字は 3 バイトであり、各バイトにも値の範囲があります。エンコーディングの状況に関係なく、英語は 128 未満であり、占有するのは 1 バイト (全角を除く) です。PHP がページを処理するとき、iconv や mb_convert などの関数を使用して文字セットを変換しますが、これには実は前提があります。つまり、正しい変換を実行するには、入力および出力のエンコードが何であるかを事前に知っておく必要があります。
次の関数は、ソース文字列のエンコードを知らなくても、ソース文字列のエンコードを自動的に決定して変換できます。 UTF8エンコードとGB2312エンコードのみをサポートしていますが、ほとんどの国内Webサイトには十分です。
コードは次のとおりです
コードをコピー |
|
関数safeEncoding($string,$outEncoding = 'UTF-8')
{
$encoding = "UTF-8";
for($i=0;$i
続行;
if((ord($string{$i})&224)==224)
{
//最初のバイトが通過しました
$char = $string{++$i};
If((ord($char)&128)==128)
{
// 2 番目のバイトが通過しました
$char = $string{++$i};
If((ord($char)&128)==128)
{
$encoding = "UTF-8";
休憩;
}
}
}
If((ord($string{$i})&192)==192)
{
//最初のバイトが通過しました
$char = $string{++$i};
If((ord($char)&128)==128)
{
// 2 番目のバイトが通過しました
$encoding = "GB2312";
休憩;
}
}
}
if(strtoupper($encoding) == strtoupper($outEncoding))
戻り $string;
それ以外
return iconv($encoding,$outEncoding,$string);
}
|
例2
コードは次のとおりです |
コードをコピー |
//中国語の文字エンコーディングを識別します。YBlog は utf-8 を使用しているため、引用通知が gb2312 エンコーディングで送信される場合、エンコーディング変換を識別して完了できる必要があります
関数safeEncoding($string,$outEncoding = 'UTF-8')
{
$encoding = "UTF-8";
for($i=0;$i
If(ord($string{$i})<128)
続く;
If((ord($string{$i})&224)==224)
//最初のバイトが通過しました
$char = $string{++$i};
If((ord($char)&128)==128)
// 2 番目のバイトが渡されました
$char = $string{++$i};
If((ord($char)&128)==128)
$encoding = "UTF-8";
壊す;
If((ord($string{$i})&192)==192)
//最初のバイトが通過しました
$char = $string{++$i};
If((ord($char)&128)==128)
// 2 番目のバイトが渡されました
$encoding = "GB2312";
壊す;
If(strtoupper($encoding) == strtoupper($outEncoding))
$string を返す;
その他 return iconv($encoding,$outEncoding,$string);
}
|
http://www.bkjia.com/PHPjc/632750.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/632750.html技術記事原理は非常に単純です。中国語の gb2312/gbk は 2 バイトであり、この 2 バイトには値の範囲があるのに対し、UTF-8 の中国語文字は 3 バイトであり、各バイトにも値の範囲があるからです。そしてどこでも英語…