php中fopen不能创建中文文件名文件的问题

摘要:
之前网页的chartset用的是utf-8,文件也用utf-8,然后用fopen()创建一个中文文件名的文件时问题就出来了,文件名都是乱码!查看了很多文档试了不少方法都解决不了,本来想着用别的方法绕过这个问题,忽然脑子里闪过Windows默认的文字编码是ansi,然后再baidu了一下,证实了这点,所以我的网页也应该是ansi编码才能使创建的文件名不会是乱码。php//实际应用中很可能是查询数据库取内容。$rows=array;$filename="tmp.htm";foreach{$title=$val[0];$content=$val[1];$pagename="测试".$id.".html";//对文件名的编码,避免中文文件名乱码$pagename=iconv;//读取模板$tmpfile=fopen;$string=fread;$string=str_replace;$string=str_replace;fclose;//写新文件$newpage=fopen;fwrite;fclose;}echo"创建成功!

之前网页的chartset用的是utf-8,文件也用utf-8,然后用fopen()创建一个中文文件名的文件时问题就出来了,文件名都是乱 码!

查看了很多文档试了不少方法都解决不了,本来想着用别的方法绕过这个问题,忽然脑子里闪过Windows默认的文字编码是ansi,然后再 baidu了一下,证实了这点,所以我的网页也应该是ansi编码才能使创建的文件名不会是乱码。

接着就着手验证,把网页都用ansi保存,去掉chartset语句,果然ok了,但是网页的内容就成乱码了,后来想起,这个网页还include 了别的网页,把include的网页也改成ansi保存,哈哈万事ok

编程这个工作真的很靠积累,如果我以前没看过Windows默认编码是ansi,那这个问题就不知何年何月才能解决了

ps:<metacontent="text/html; charset=utf-8"http-equiv="Content-type">这个meta标记一定要放在<title></title>之前才有效的

后来又想到了一个更好的解决方法,网页还是用utf-8编码和保存,只是fopen()里的文件名参 数单独给它编下码就行,php有iconv()这个改换编码的程序,把utf-8转成 gb2312就可以避免中文文件名为乱码了

==================================

test.htm

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
<title>标题:{title}</title>
</head>
<body>
<b>此新闻的内容:</b>{content}
</body>
</html>

test.php

<?php

//实际应用中很可能是查询数据库取内容。
$rows = array(array("替换标题1","替换内容1"),array("替换标题2","替换内容2"));
$filename = "tmp.htm";
foreach($rows as $id => $val){
$title = $val[0];
$content = $val[1];
$pagename = "测试".$id.".html";
//对文件名的编码,避免中文文件名乱码
$pagename =iconv("UTF-8", "GBK", $pagename);
//读取模板
$tmpfile = fopen($filename,"r");
$string = fread($tmpfile,filesize($filename));
$string = str_replace("{title}",$title,$string);
$string = str_replace("{content}",$content,$string);
fclose($tmpfile);
//写新文件
$newpage = fopen($pagename,"w");
fwrite($newpage,$string);
fclose($newpage);
}
echo "创建成功!";
?>

免责声明:文章转载自《php中fopen不能创建中文文件名文件的问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇R语言做正态分布检验彻底理解Gradle的任务下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

现代 PHP 新特性系列(四) —— 生成器的创建和使用

1、概述      生成器是 PHP 5.5 引入的新特性,但是目测很少人用到它,其实这是个非常有用的功能。      生成器和迭代器有点类似,但是与标准的PHP迭代器不同,PHP生成器不要求类实现Iterator接口,从而减轻了类的开销和负担。生成器会根据需求每次计算并产出需要迭代的值,这对应用的性能有很大的影响:试想假如标准的PHP迭代器经常在内存中执...

[php]laravel框架容器管理的一些要点

本文面向php语言的laravel框架的用户,介绍一些laravel框架里面容器管理方面的使用要点。文章很长,但是内容应该很有用,希望有需要的朋友能看到。php经验有限,不到位的地方,欢迎帮忙指正。 1. laravel容器基本认识 laravel框架是有一个容器框架,框架应用程序的实例就是一个超大的容器,这个实例在bootstrap/app.php内进行...

php集成动态口令认证

这篇文章主要为大家详细介绍了php集成动态口令认证,动态口令采用一次一密、用过密码作废的方式来提高安全性能,感兴趣的小伙伴们可以参考一下 大多数系统目前均使用的静态密码进行身份认证登录,但由于静态密码容易被窃取,其安全性无法满足安全要求。 动态口令采用一次一密、用过密码作废的方式防止了密码被窃取带来的安全问题。动态口令分为HOTP(基于事件计数的动态口令,...

3个解析url的php函数

通过url进行传值,是php中一个传值的重要手段。所以我们要经常对url里面所带的参数进行解析,如果我们知道了url传递参数名称,例如 /index.php?name=tank&sex=1#top 我们就可以通过$_GET['name'],$_GET['sex']来获得传的数据。但是如果我们不知道这些变量名又怎么办呢?这也是写这篇博文的目的,因为自...

PHP-数据库操作

连接数据库 PHP操作数据库的方式有多种如 mysql 、mysqli、PDO,目前主要使用的是PDO处理。 PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。 下面是使用 PDO 连接数据库的操作,当连接失败时将抛出异常。 <?php header('Content-type:text/ht...

LFI-labs

CMD-1 查看源代码: <?php system($_GET["cmd"]); ?> 这个没有任何过滤,直接命令执行即可。payload: ?cmd=whoani CMD-2 这题和上面一样,只不过改成了POST请求。 CMD-3 查看源码: <?php system("/usr/bin/whois " . $_G...