如何解决php中big5转utf8乱码的问题?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
php中big5转utf8乱码的解决办法:首先生成tab文件,并生成时要保证tab文件不存在;然后将指定页面转码测试;接着打印出文字库;最后big5转【utf-8】即可。
php中big5转utf8乱码的解决办法:
第一步:生成tab文件,生成时要保证tab文件不存在才可以
writebig5UnicodeFile();
第二步:指定页面转码测试
testCode();
第三步:打印出文字库
printfCode();
<?php
//生成big5-unicode 编码文件
function loadBig5(){
$fp = fopen( './big5-unicode.txt', 'r' );
$big5_unicode_arr = array();
while($one_line = fgets($fp)) {
$one_line_arr = explode("\t",$one_line);
$big5 = hexdec(trim($one_line_arr[0]));
$unicode = trim($one_line_arr[1]);
if(strpos($unicode,',')) {
$unicode = ltrim(explode(',',$unicode)[0],'<');
}
$big5_unicode_arr[$big5] = hexdec($unicode);
}
return $big5_unicode_arr;
}
//追加形式写入文件
function putContent($content) {
static $fp;
if(!isset($fp)) {
$fp = fopen( './big5-unicode-new.tab', 'a+' );
}
fwrite($fp,$content);
}
//生成tab文件
function writebig5UnicodeFile() {
$big5_unicode_arr = loadBig5();
$big5_unicod_content = array();
$min = 2000;
$max = 0;
$max_unicode = 0;
foreach($big5_unicode_arr as $big5 => $unicode) {
$h = floor($big5/256);
$l = $big5%256;
$index = ($h-135)*256*3+$l*3;
if($index<$min) {
$min = $index;
}
if($max<$index) {
$max = $index;
}
if($unicode>$max_unicode) {
$max_unicode = $unicode;
}
$h_1 = floor($unicode/65536);
$h_2 = floor($unicode/256);
$h_3 = $unicode%256;
$big5_unicod_content[$index] = chr($h_1).chr($h_2).chr($h_3);
}
for($i=0;$i<=$max;$i=$i+3) {
if(!isset($big5_unicod_content[$i])) {
$big5_unicod_content[$i] = chr(0).chr(0).chr(0);
}
}
for($i=0;$i<=$max;$i=$i+3) {
if(strlen($big5_unicod_content[$i]) == 3) {
putContent($big5_unicod_content[$i]);
}else{
die('error');
}
}
}
//测试编辑结果
function testCode() {
$content = file_get_contents( './temlate_2.html');
echo b2u($content);
}
//打印出编码库文字
function printfCode() {
$fp = fopen( './big5-unicode-new.tab', 'r' );
$len = filesize('./big5-unicode-new.tab');
$x = 0;
$outstr = array();
// fseek( $fp, 21000 - 900 + 42*3);
for($i=$x=0;$i<$len;$i=$i+3) {
$uni = fread( $fp, 3 );
$codenum = ord($uni[0])*65536 + ord($uni[1])*256 + ord($uni[2]);
if($codenum == 0) {
$outstr[$x++] = ' ';
}elseif( $codenum < 0x80 ) {
$outstr[$x++] = chr($codenum);
}elseif($codenum < 0x800) {
$outstr[$x++] = chr( 192 + $codenum / 64 );
$outstr[$x++] = chr( 128 + $codenum % 64 );
}elseif($codenum < 0x10000){
$outstr[$x++] = chr( 224 + floor($codenum / 4096 ));
$codenum = $codenum%4096;
$outstr[$x++] = chr( 128 + floor($codenum / 64 ));
$outstr[$x++] = chr( 128 + ($codenum % 64) );
}else{
$outstr[$x++] = chr( 240 + floor($codenum / 262144 ));
$codenum = $codenum%262144;
$outstr[$x++] = chr( 128 + floor($codenum / 4096 ));
$codenum = $codenum%4096;
$outstr[$x++] = chr( 128 + ($codenum / 64) );
$outstr[$x++] = chr( 128 + ($codenum % 64) );
}
}
echo join( '', $outstr);
}
//big5 转 utf-8
function b2u( $instr ) {
$fp = fopen( './big5-unicode-new.tab', 'r' );
$len = strlen($instr);
$outstr = '';
for( $i = $x = 0 ; $i < $len ; $i++ ) {
$h = ord($instr[$i]);
if( $h >= 135 ) {
$l = ord($instr[$i+1]);
fseek( $fp, ($h-135)*256*3+$l*3 );
$uni = fread( $fp, 3 );
$codenum = ord($uni[0])*65536 + ord($uni[1])*256 + ord($uni[2]);
if($codenum == 0) {
$outstr[$x++] = ' ';
}elseif( $codenum < 0x80 ) {
$outstr[$x++] = chr($codenum);
}elseif($codenum < 0x800) {
$outstr[$x++] = chr( 192 + $codenum / 64 );
$outstr[$x++] = chr( 128 + $codenum % 64 );
}elseif($codenum < 0x10000){
$outstr[$x++] = chr( 224 + floor($codenum / 4096 ));
$codenum = $codenum%4096;
$outstr[$x++] = chr( 128 + floor($codenum / 64 ));
$outstr[$x++] = chr( 128 + ($codenum % 64) );
}else{
$outstr[$x++] = chr( 240 + floor($codenum / 262144 ));
$codenum = $codenum%262144;
$outstr[$x++] = chr( 128 + floor($codenum / 4096 ));
$codenum = $codenum%4096;
$outstr[$x++] = chr( 128 + ($codenum / 64) );
$outstr[$x++] = chr( 128 + ($codenum % 64) );
}
$i++;
}
else
$outstr[$x++] = $instr[$i];
}
fclose($fp);
if( $instr != '' )
return join( '', $outstr);
}
看完上述内容,你们掌握如何解决php中big5转utf8乱码的问题的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注天达云行业资讯频道,感谢各位的阅读!