php实现简->繁转换的问题,查了N多资料,百思不得其解,在线求教

cnxuchao 2005-12-16 12:05:46
先谢谢各位了.

这是代码:

<?php

$filename="73hduip3_d3s/h73ghdn_3hx78.icbuy"; //gb2312->big5的码表....
$fp=fopen($filename,"rb");
$gb=fread($fp,filesize($filename));
fclose($fp);

function gb2big5($text) {
global $gb;
$max=strlen($text)-1;
for ($i=0;$i<$max;$i++) {
$h=ord($text[$i]);
if ($h>=160) {
$l=ord($text[$i+1]);
if ($h==161 && $l==64) {
$big=" ";
}
else {
$p=($h-160)*510+($l-1)*2;
$big=$gb[$p].$gb[$p+1];
}
$text[$i]=$big[0];
$text[$i+1]=$big[1];
$i++;
}
}
return $text;
}

if ($_GET["url"]=="/") $_GET["url"]="/index.php";

$from_chk_1=strpos($_GET["url"],'http://');
$from_chk_2=strpos($_GET["url"],'ftp://');
$from_chk_3=strpos($_GET["url"],'www.');
if ($from_chk_1==true || $from_chk_2==true || $from_chk_3==true) die('where will you go?');

$file_name="http://www.xxxxxx.net".$_GET["url"];
$file_content=fopen($file_name,"r");

if (!$file_content) {
echo "无法读取源文件.<b>sorry, i can't read the resource.";
exit;
}
/*while (!feof($file_content)) {
$content=fgets($file_content,2000);
}*/
$content=fread($file_content);
fclose($file_content);

$content=str_replace("charset=gb2312","charset=big5",$content);

echo gb2big5($content);
?>

这样的话报错 Warning: Wrong parameter count for fread() in /data/www/xxxx/transfer/index.php on line 49

如果去掉上面的 $content=fread($file_content); ,恢复被注释的内容, 无任何报错, 页面无任何输出, 查看源文件失效.

各位能否帮我看看, 问题在哪里. 若有更好建议, 我感激不尽.
...全文
226 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnxuchao 2005-12-17
  • 打赏
  • 举报
回复
呵呵, 谢谢楼上的.
手册有啊, 查了没什么感觉, 才来问各位行家的.
我今天再试试, 再告诉各位结果.
多谢多谢.
cnxuchao 2005-12-17
  • 打赏
  • 举报
回复
问题已顺利解决. 多谢 gu1dai(异域苍穹......追夢人) 兄弟及其他朋友.
给分!
SuperBJack 2005-12-16
  • 打赏
  • 举报
回复
$filename 有权限读取吗?
gu1dai 2005-12-16
  • 打赏
  • 举报
回复
要这样
/*while (!feof($file_content)) {
$content.=fgets($file_content,2000);
}*/
从你对句柄的命名来看。你还没理解fopen返回的是什么。
一般这样
$handle = fopen($file,"rb");

这只是打开了一个指向文件的可以通过它来对文件操作的资源句柄。

取内容则用fread或别的反复读取,将内容取完
最后得到的才是$content.


所以我建议你用file_get_contents。多方便的函数。(你手边没手册?)

cnxuchao 2005-12-16
  • 打赏
  • 举报
回复
谢谢楼上的几位.
我再试试.
刚才说用js的那位, 是不是说的这个 http://community.csdn.net/Expert/topic/4150/4150267.xml?temp=.6100275

还有刚才说到fread要给予读取长度, 我的这段代码是给了, 但也没用, 空白:
/*while (!feof($file_content)) {
$content=fgets($file_content,2000);
}*/
xuzuning 2005-12-16
  • 打赏
  • 举报
回复
$content=fread($file_content);

fread函数需要有两个参数,第一个是被打开的文件资源(你已经有了),第二个是读取的长度
你没有给,当然要出错了
gu1dai 2005-12-16
  • 打赏
  • 举报
回复
fread,fgets适合用在文件超过1M的情况下使用。或者用在需要对文件的每行分别处理的情况下使用。

对于小文件,file_get_contents直接将内容读出,照手册上说的,速度是用fread的6倍。
gu1dai 2005-12-16
  • 打赏
  • 举报
回复
这种小文件,这种情况别用fread.
直接用$gb=file_get_contents($filename,"rb");替代下面这三行。
$fp=fopen($filename,"rb");
$gb=fread($fp,filesize($filename));
fclose($fp);

fread是将你的gb码表读取到字符串里。当然不能去掉了。

用js转换?晕。js的escape函数能将不同的编码转为utf-8码值。是不能用来将gb->big5的。
gb-big5以及这些方言之间的转换。方言到unicode的转换,方言到utf-8的转换统统只能用码表来硬转换。
zairwolfo 2005-12-16
  • 打赏
  • 举报
回复
最省懒的方法是用js转换。
cnxuchao 2005-12-16
  • 打赏
  • 举报
回复
有的, 文件夹755, 文件644.

if ($_GET["url"]=="/") $_GET["url"]="/index.php";
这行之前都没报错, 估计没问题吧.

21,891

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧