php 获取数据乱码问题 本帖最后由 qq_25293153 于 2015-01-13 15:42:18 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ...$neirong = file_get_contents($url, false, $context);echo base64_encode($neirong);贴出结果 是一篇文章,结果太长了,我贴一段吧77u/ICAgIOiwjeeWlOahteaYlOaZhOixkeebqOaak++8jOmAveS6juWHkeS+k+WyqeeGmueeg+ebqOa0headremAv $c = '77u/ICAgIOiwjeeWlOahteaYlOaZhOixkeebqOaak++8jOmAveS6juWHkeS+k+WyqeeGmueeg+ebqOa0headremAv';echo base64_decode($c);谍疔桵昔晄豑盨暓,逽于凑侓岩熚瞃盨洅杭��沒有亂碼啊。最後那個是因為你的base64 不完整。 这个是采集数据地址http://www.ziyouge.com/conbdhekbefiab这个是它网站的显示页面http://www.ziyouge.com/zy/4/4980/1333249.html采集地址的数据不正常,但它的页面显示正常 本帖最后由 fdipzone 于 2015-01-13 22:25:23 编辑 fdipzone ,用你的方法还是输出的乱码,对解密不太了解 你在輸出的html中加入<meta http-equiv="content-type" content="text/html; charset=utf-8">它源數據是做了些轉換的,我那個程序已經是轉換過來了。我把採集的也寫出來,直接運行就可以了。<?php //http://www.ziyouge.com/conbdhekbefiab//http://www.ziyouge.com/zy/4/4980/1333249.html// 獲取程序$url = 'http://www.ziyouge.com/conbdhekbefiab';$headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36';$headerArr = array(); foreach( $headers as $n => $v ) { $headerArr[] = $n .':' . $v; }$ch = curl_init();curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HTTPHEADER , $headerArr ); //构造IPcurl_setopt($ch, CURLOPT_REFERER, 'http://www.ziyouge.com/'); //构造来路$content = curl_exec($ch);$content = substr($content,3);if($error=curl_error($ch)){ die($error);}curl_close($ch);// 分析程序$result = '';$str_length = mb_strlen($content);$i=0;while ($i<=$str_length){ $temp_str=mb_substr($content,$i,1); $ascnum=Ord($temp_str); if ($ascnum>=224){ $result .= change(mb_substr($content,$i,3)); $i=$i+3; }else{ $result .= mb_substr($content,$i,1); $i=$i+1; }}echo '<meta http-equiv="content-type" content="text/html;charset=utf-8">';echo $result;// 處理function change($str){ $ignore = array('“','”','!','…',':',',',','); if(in_array($str, $ignore)){ return $str; } $prefix = "%u"; $postfix = ""; $str = iconv('UTF-8', 'UCS-2', $str); $arrstr = str_split($str, 2); $unistr = ''; for($i = 0, $len = count($arrstr); $i < $len; $i++) { $tmp = hexdec(bin2hex($arrstr[$i])); $tmp = str_pad(dechex($tmp),4,'0',STR_PAD_LEFT); $tmp = decrypt(substr($tmp,2,2).substr($tmp,0,2)); $unistr .= $prefix . $tmp . $postfix; } return unescape($unistr);}// 解密function decrypt($d){ $result = str_pad(dechex(hexdec($d)-100),4,'0',STR_PAD_LEFT); return $result;}// 轉中文function unescape($str) { $ret = ''; $len = strlen ( $str ); for($i = 0; $i < $len; $i ++) { if ($str [$i] == '%' && $str [$i + 1] == 'u') { $val = hexdec ( substr ( $str, $i + 2, 4 ) ); if ($val < 0x7f) $ret .= chr ( $val ); else if ($val < 0x800) $ret .= chr ( 0xc0 | ($val >> 6) ) . chr ( 0x80 | ($val & 0x3f) ); else $ret .= chr ( 0xe0 | ($val >> 12) ) . chr ( 0x80 | (($val >> 6) & 0x3f) ) . chr ( 0x80 | ($val & 0x3f) ); $i += 5; } else if ($str [$i] == '%') { $ret .= urldecode ( substr ( $str, $i, 3 ) ); $i += 2; } else $ret .= $str [$i]; } return $ret; } ?> 出现乱码是因为php版本不同,我在5.3.28测试正常,在PHP 6.0.0-dev 中测试就是乱码,是不是PHP 6.0.0-dev缺少了什么组件 本地 5.3.28正常,换到服务器5.3.28又出现乱码了liunx的环境 ,本地是 ubuntu,服务器是Debian 估計與php mb string 的版本有關。環境問題只能靠你自己處理了,我這邊沒有這麼多環境。 已经发现问题所在。不同平台下 $str = iconv('UTF-8', 'UCS-2', $str); //这句输出的结果不同//例如:$str="幖"; $str = iconv('UTF-8', 'UCS-2', $str);正常的结果是“V^”;不正常的结果是“^V”;请教这个该怎么解决 找到方法了。。不同平台转换的usc-2编码不同对于 UCS-2, linux 下默认是 UCS-2BE。用iconv(指定UCS-2)来转换生成的是 UCS-2BE 的 unicode。如果转换windows平台过来的 UCS-2, 需要指定 UCS-2LE。 嗯$str = iconv('UTF-8', 'UCS-2', $str);改為$str = iconv('UTF-8', 'UCS-2LE', $str);就可以了。 其实根本就没那么复杂$content = file_get_contents('密文.txt');$ignore = unpack('v*', iconv('utf-8', 'ucs-2le', '“”!…:,,'));$ar = unpack('v*', iconv('utf-8', 'ucs-2le', $content));$result = '';foreach($ar as $v) { if(! in_array($v, $ignore)) $v -= 100; $result .= iconv('ucs-2be', 'utf-8', pack('n', $v));}echo $result;他不过是将两个字节前后倒一下 php json 如何按需备份SQLite数据? 这样就可以告别注入漏洞了? 乱码问题,请大家帮忙 请教一个php递归读取服务器硬盘分区、目录的源代码 各位帮我看看这个例子错在哪里? 使用ADO如何列出指定数据库中所有的表 求教, 各位高手 帮忙 。。 高分相送。。 关于自动换行 smarty templates_c 预编译文件问题 求助关于淘宝API返回XML简单对象提取为数组的问题? 求教微信接口!!!!!!!!!!!!!!!!!
$neirong = file_get_contents($url, false, $context);
echo base64_encode($neirong);贴出结果
是一篇文章,结果太长了,我贴一段吧
77u/ICAgIOiwjeeWlOahteaYlOaZhOixkeebqOaak++8jOmAveS6juWHkeS+k+WyqeeGmueeg+ebqOa0headremAv
$c = '77u/ICAgIOiwjeeWlOahteaYlOaZhOixkeebqOaak++8jOmAveS6juWHkeS+k+WyqeeGmueeg+ebqOa0headremAv';
echo base64_decode($c);
谍疔桵昔晄豑盨暓,逽于凑侓岩熚瞃盨洅杭��
沒有亂碼啊。最後那個是因為你的base64 不完整。
这个是采集数据地址
http://www.ziyouge.com/conbdhekbefiab这个是它网站的显示页面
http://www.ziyouge.com/zy/4/4980/1333249.html采集地址的数据不正常,但它的页面显示正常
<meta http-equiv="content-type" content="text/html; charset=utf-8">
它源數據是做了些轉換的,我那個程序已經是轉換過來了。我把採集的也寫出來,直接運行就可以了。<?php
//http://www.ziyouge.com/conbdhekbefiab
//http://www.ziyouge.com/zy/4/4980/1333249.html// 獲取程序$url = 'http://www.ziyouge.com/conbdhekbefiab';$headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36';
$headerArr = array();
foreach( $headers as $n => $v ) {
$headerArr[] = $n .':' . $v;
}$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER , $headerArr ); //构造IP
curl_setopt($ch, CURLOPT_REFERER, 'http://www.ziyouge.com/'); //构造来路
$content = curl_exec($ch);
$content = substr($content,3);
if($error=curl_error($ch)){
die($error);
}
curl_close($ch);// 分析程序$result = '';
$str_length = mb_strlen($content);
$i=0;
while ($i<=$str_length)
{
$temp_str=mb_substr($content,$i,1);
$ascnum=Ord($temp_str);
if ($ascnum>=224){
$result .= change(mb_substr($content,$i,3));
$i=$i+3;
}else{
$result .= mb_substr($content,$i,1);
$i=$i+1;
}
}echo '<meta http-equiv="content-type" content="text/html;charset=utf-8">';
echo $result;// 處理
function change($str){ $ignore = array('“','”','!','…',':',',',','); if(in_array($str, $ignore)){
return $str;
} $prefix = "%u";
$postfix = "";
$str = iconv('UTF-8', 'UCS-2', $str);
$arrstr = str_split($str, 2);
$unistr = '';
for($i = 0, $len = count($arrstr); $i < $len; $i++) {
$tmp = hexdec(bin2hex($arrstr[$i]));
$tmp = str_pad(dechex($tmp),4,'0',STR_PAD_LEFT);
$tmp = decrypt(substr($tmp,2,2).substr($tmp,0,2));
$unistr .= $prefix . $tmp . $postfix;
}
return unescape($unistr);
}// 解密
function decrypt($d){
$result = str_pad(dechex(hexdec($d)-100),4,'0',STR_PAD_LEFT);
return $result;
}// 轉中文
function unescape($str) {
$ret = '';
$len = strlen ( $str );
for($i = 0; $i < $len; $i ++) {
if ($str [$i] == '%' && $str [$i + 1] == 'u') {
$val = hexdec ( substr ( $str, $i + 2, 4 ) );
if ($val < 0x7f)
$ret .= chr ( $val );
else if ($val < 0x800)
$ret .= chr ( 0xc0 | ($val >> 6) ) . chr ( 0x80 | ($val & 0x3f) );
else
$ret .= chr ( 0xe0 | ($val >> 12) ) . chr ( 0x80 | (($val >> 6) & 0x3f) ) . chr ( 0x80 | ($val & 0x3f) );
$i += 5;
} else if ($str [$i] == '%') {
$ret .= urldecode ( substr ( $str, $i, 3 ) );
$i += 2;
} else
$ret .= $str [$i];
}
return $ret;
}
?>
出现乱码是因为php版本不同,我在5.3.28测试正常,在PHP 6.0.0-dev 中测试就是乱码,是不是PHP 6.0.0-dev缺少了什么组件
liunx的环境 ,本地是 ubuntu,服务器是Debian
環境問題只能靠你自己處理了,我這邊沒有這麼多環境。
$str = iconv('UTF-8', 'UCS-2', $str); //这句输出的结果不同//例如:
$str="幖";
$str = iconv('UTF-8', 'UCS-2', $str);正常的结果是“V^”;
不正常的结果是“^V”;
请教这个该怎么解决
对于 UCS-2, linux 下默认是 UCS-2BE。用iconv(指定UCS-2)来转换生成的是 UCS-2BE 的 unicode。如果转换windows平台过来的 UCS-2, 需要指定 UCS-2LE。
改為
$str = iconv('UTF-8', 'UCS-2LE', $str);就可以了。
$ignore = unpack('v*', iconv('utf-8', 'ucs-2le', '“”!…:,,'));
$ar = unpack('v*', iconv('utf-8', 'ucs-2le', $content));
$result = '';
foreach($ar as $v) {
if(! in_array($v, $ignore)) $v -= 100;
$result .= iconv('ucs-2be', 'utf-8', pack('n', $v));
}
echo $result;
他不过是将两个字节前后倒一下