[[IT知识]] 揭秘PHP无BOM创建UTF-8文件的秘密

[复制链接]
查看: 34|回复: 0
发表于 2025-2-9 09:40:02 | 显示全部楼层 | 阅读模式
易博V9下载

揭秘PHP无BOM创建UTF-8文件的秘密

今天心血来潮,想写一个php创建utf-8文件的功能,各种百度谷歌后,发现创建的utf-8文件有bom,那么我就想写一个没有bom头的php创建utf-8文件功能,经过自己的各种尝试和实践后,终于让我搞定了。要知道文件本身的格式,也是影响页面乱码的重要原因,详细可以看我的博文,bom呢会让页面头部多一行空白,所以也要去掉。

这个功能分两步完成,文件本身编码的格式就是取决于bom头,所以我们要用php写入一个utf-8指定的bom头,并且因为一些特殊的原因,我们不能中途用编辑器打开这个创建的带bom的文件,因为很多编辑器有自己的过滤功能,会自动讲文件另存为utf-8后会因为内容中全是英文而自动转为ANSI,原因就是因为中文才有编码问题,而英文和数字没有。所以我们首先创建一个文件,写入utf-8的bom头,并写入utf-8编码的中文字符(为什么一定要中文字符呢,这就是为什么有的时候我们发现我们无论怎么另存一个文件都无法另存为utf-8的,而内容中如果有中文,就可以了,只有中文才有utf-8!!!),这时候就会创建一个带有bom的utf-8文件,但是中文字符会显示为空白,原因这个文件是先写入内容,后转化格式的。然后,我们再用php将这个bom头截取掉就变成了没有bom的utf-8文件。所以,一般如果你要创建这样的文件,要先这样来创建,然后再用php打开写入你想要写入的内容。代码入下:

  1. <?php
  2. $filename = 'test.html';
  3. $f=fopen($filename, "wb");
  4. $text=utf8_encode('我a'); //必须是中文
  5. //先用函数utf8_encode将所需写入的数据变成UTF编码格式。
  6. $text="\xEF\xBB\xBF".$text;
  7. //"\xEF\xBB\xBF",这串字符不可缺少,生成的文件将成为UTF-8格式,否则依然是ANSI格式。
  8. fputs($f, $text);
  9. //写入。
  10. fclose($f);
  11. echo checkBOM($filename);
  12. function checkBOM ($filename) {
  13. $contents = file_get_contents($filename);
  14. $charset[1] = substr($contents, 0, 1);
  15. $charset[2] = substr($contents, 1, 1);
  16. $charset[3] = substr($contents, 2, 1);
  17. if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) {
  18. $rest = substr($contents, 3);
  19. rewrite ($filename, $rest);
  20. return ("<font color=red>ok</font>");
  21. }
  22. else return ("BOM Not Found.");
  23. }
  24. function rewrite ($filename, $data) {
  25. $filenum = fopen($filename, "w");
  26. flock($filenum, LOCK_EX);
  27. fwrite($filenum, $data);
  28. fclose($filenum);
  29. }
  30. ?>
复制代码

下面附上一个直接批量去除目录下所有文件bom的php功能代码:

  1. <?php
  2. if (isset($_GET['dir'])){ //config the basedir
  3. $basedir=$_GET['dir'];
  4. }else{
  5. $basedir = '.';
  6. }
  7. $auto = 1;
  8. checkdir($basedir);
  9. function checkdir($basedir){
  10. if ($dh = opendir($basedir)) {
  11. while (($file = readdir($dh)) !== false) {
  12. if ($file != '.' && $file != '..'){
  13. if (!is_dir($basedir."/".$file)) {
  14. echo "filename: $basedir/$file ".checkBOM("$basedir/$file")." <br>";
  15. }else{
  16. $dirname = $basedir."/".$file;
  17. checkdir($dirname);
  18. }
  19. }
  20. }
  21. closedir($dh);
  22. }
  23. }
  24. function checkBOM ($filename) {
  25. global $auto;
  26. $contents = file_get_contents($filename);
  27. $charset[1] = substr($contents, 0, 1);
  28. $charset[2] = substr($contents, 1, 1);
  29. $charset[3] = substr($contents, 2, 1);
  30. if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) {
  31. if ($auto == 1) {
  32. $rest = substr($contents, 3);
  33. rewrite ($filename, $rest);
  34. return ("<font color=red>BOM found, automatically removed.</font>");
  35. } else {
  36. return ("<font color=red>BOM found.</font>");
  37. }
  38. }
  39. else return ("BOM Not Found.");
  40. }
  41. function rewrite ($filename, $data) {
  42. $filenum = fopen($filename, "w");
  43. flock($filenum, LOCK_EX);
  44. fwrite($filenum, $data);
  45. fclose($filenum);
  46. }
  47. ?>
复制代码

 

易博软件介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1、请认真发帖,禁止回复纯表情,纯数字等无意义的内容!帖子内容不要太简单!
2、提倡文明上网,净化网络环境!抵制低俗不良违法有害信息。
3、如果你对主帖作者的帖子不屑一顾的话,请勿回帖。谢谢合作!
3、问答求助区发帖求助后,如有其他用户热心帮您解决问题后,请自觉点击设为最佳答案按钮。

 
 
QQ在线客服
QQ技术支持
工作时间:
8:00-18:00
软著登字:
1361266号
官方微信扫一扫
weixin

QQ|小黑屋|Archiver|慈众营销 ( 粤ICP备15049986号 )|网站地图

自动发帖软件 | 自动发帖器 | 营销推广软件 | 网络营销工具 | 网络营销软件 | 网站推广工具 | 网络推广软件 | 网络推广工具 | 网页推广软件 | 信息发布软件 | 网站推广工具 | 网页推广软件

Powered by Discuz! X3.4   © 2012-2020 Comsenz Inc.  慈众科技 - Collect from 深圳吉宝泰佛文化有限公司 公司地址:罗湖区黄贝街道深南东路集浩大厦A1403

返回顶部 返回列表