PHP读文件的一个乱码问题

D:/3.txt是utf-8文件

$f1 = fopen('D:/3.txt','r');
$str = fread($f1,10000);
fclose($f1);
echo substr($str,1,3);

有bom问题,微软为了标记这个文本为utf文本,加入三个字节,分别为

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

 

<?php
 
 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")." <br>";  
          }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=red>BOM found, automatically removed._<a href=http://www.k686.com>http://www.k686.com</a></font>");  
   } 
   else
    {  
    return ("<font color=red>BOM found.</font>");  
    }  
 }  
 else return ("BOM Not Found.");  
 }  
 
 function rewrite ($filename, $data)
 {  
 $filenum = fopen($filename, "w");  
 flock($filenum, LOCK_EX);  
 fwrite($filenum, $data);  
 fclose($filenum);  
 }  
?>

 以上代码是删除BOM的PHP代码。

截取的时候,可以从第四位开始截取。如果从第一、二、或者第三位截取,可能会出现乱码.

UTF-8编码中一个汉字可能会使用三个字节表示

如果有汉字,不要使用ANSI编码,否则读取的时候会出现乱码

 

ANSI编码 (百科里面的)

  unicode和ansi都是字符代码的一种表示形式。   为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。比如:汉字 '中' 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。   不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。

  不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。

如果是英文或符号那么编码为1个字节,而且最高位为0,如果是中文那么最高位肯定为1,大小为2个字节。

 

由此看来,如果在我们的中文电脑中存储ansi的文本文件中如果有日语或者韩语的时候,有可能造成编码的冲突,也就是说我们不可能在记事本中用ansi编码存储中日韩的混合文字。电脑中的记事本是针对中文版系统开发的。如果想通用的话,那我们就得把txt文件存储成Unicode格式的文本文件。所以,如果想做国际化的东西,还是用Unicode方便。其实,现在的操作系统大部分都是用Unicode编码的,如果我们使用的是ansi编码,那么系统内部处理的时候还是得转换成Unicode,反而造成代码效率低了。还是用Unicode方便啊!

 

转载于:https://www.cnblogs.com/z497688734/p/3657171.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值