检测文件是否有bom头

检测文件是否有bom头,第1张

方法一:用Ultraedit或Editplus打开PHP文件,另存为无Bom的utf-8文件方法二:用Dreamweaver去除Bom头

菜单–修改–页面属性 或者ctrl+j打开页面属性窗口,点选“标题/编码”去掉“包括Unicode签名Bom”前的勾

有Bom的文件太多?这样太麻烦?当然有更好的方法!方法三:用php文件批量去除bom头 将以下这段代码保存为php文件,上传到服务器,用浏览器访问它!<?phpif (isset($_GET['dir'])){ //设置文件目录

$basedir=$_GET['dir']}else{$basedir = '.'}$auto = 1checkdir($basedir)

function checkdir($basedir){

if ($dh = opendir($basedir)) {

while (($file = readdir($dh)) !== false) {

if ($file != '.' &&$file != '..'){

if (!is_dir($basedir./.$file)) {

echo filename: $basedir/$file .checkBOM($basedir/$file). }else{$dirname = $basedir./.$file

checkdir($dirname)}}}closedir($dh)}}function checkBOM ($filename) {

global $auto

$contents = file_get_contents($filename)

$charset[1] = substr($contents, 0, 1)

$charset[2] = substr($contents, 1, 1)

$charset[3] = substr($contents, 2, 1)

if (ord($charset[1]) == 239 &&ord($charset[2]) == 187 &&ord($charset[3]) == 191) {

if ($auto == 1) {

$rest = substr($contents, 3)

rewrite ($filename, $rest)

return (<font color=redBOM found, automatically removed.</font)} else {return (<font color=redBOM found.</font)}}else return (BOM Not Found.)}function rewrite ($filename, $data) {

$filenum = fopen($filename, w)

flock($filenum, LOCK_EX)

fclose($filenum)}?还用记事本保存?那你真是智商捉急了!

1.类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB

0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。对于一般的文件,这样并不会产生什么麻烦。但对于

PHP来说,BOM是个大麻烦。

2.PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。根据嵌入式语言的特点,这串字符将被直接执行

(显示)出来。由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个字符呢!

3.最大的麻烦还不是这个。受COOKIE送出机制的限制,在这些文件开头已经有BOM的文件中,COOKIE无法送出(因为在COOKIE送出前PHP已经送出了文件头),所以登入和登出功能失效。一切依赖COOKIE、SESSION实现的功能全部无效。

<?php

/*检测并清除BOM*/

if(isset($_GET['dir'])){

$basedir=$_GET['dir']

}else{

$basedir = '.'

}

$auto = 1

checkdir($basedir)

function checkdir($basedir){

if($dh = opendir($basedir)){

while(($file = readdir($dh)) !== false){

if($file != '.' &&$file != '..'){

if(!is_dir($basedir."/".$file)){

echo "filename: $basedir/$file ".checkBOM("$basedir/$file")." "

}else{

$dirname = $basedir."/".$file

checkdir($dirname)

}

}

}//end while

closedir($dh)

}//end if($dh

}//end function

function checkBOM($filename){

global $auto

$contents = file_get_contents($filename)

$charset[1] = substr($contents, 0, 1)

$charset[2] = substr($contents, 1, 1)

$charset[3] = substr($contents, 2, 1)

if(ord($charset[1]) == 239 &&ord($charset[2]) == 187 &&ord($charset[3]) == 191){

if($auto == 1){

$rest = substr($contents, 3)

rewrite ($filename, $rest)

return "<font color=red>BOM found, automatically removed.</font>"

}else{

return ("<font color=red>BOM found.</font>")

}

}

else return ("BOM Not Found.")

}//end function

function rewrite($filename, $data){

$filenum = fopen($filename, "w")

flock($filenum, LOCK_EX)

fwrite($filenum, $data)

fclose($filenum)

}//end function

?>

下面这个可以将bom头过滤

byte[] allbytes = line.getBytes("UTF-8")

for (int i=0i <allbytes.lengthi++)

{

int tmp = allbytes[i]

String hexString = Integer.toHexString(tmp)

// 1个byte变成16进制的,只需要2位就可以表示了,取后面两位,去掉前面的符号填充

hexString = hexString.substring(hexString.length() -2)

System.out.print(hexString.toUpperCase())

System.out.print(" ")

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12079247.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存