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方便啊!
PHP读文件的一个乱码问题的更多相关文章
- python读文件出现中文乱码
更新: 一个解释更详细和全面的博文:https://www.cnblogs.com/zhangqigao/p/6496172.html 最近开始处理中文文本,读取文件有时候会出现乱码.原因:编码和解码 ...
- Json文件转换为Excel文件!涉及读文件,时间戳转化,写文档
一. 思路 今天接到个小任务,让把json文件转换成excel文件,按照列展开. 思路:既然json已经都已经是现成的,那直接将json文件做读操作,在通过不同的key,找到对应的信息,在存到单元格中 ...
- 根据python上下文管理,写一个在读文件内容前后自动打开关闭文件的程序
利用上下文管理实现读f文件前后自动打开关闭文件#在本目录创建f文件,内容写monkey代码如下 import contextlib #导入模块1 @contextlib.contextmanager# ...
- python 写文件write(string), writelines(list) ,读文件
read()方法用于直接读取字节到字符串中,可以接参数给定最多读取的字节数,如果没有给定,则文件读取到末尾. readline()方法读取打开文件的一行(读取下个行结束符之前的所有字节),然后整行,包 ...
- GoLang几种读文件方式的比较
GoLang提供了很多读文件的方式,一般来说常用的有三种.使用Read加上buffer,使用bufio库和ioutil 库. 那他们的效率如何呢?用一个简单的程序来评测一下: package main ...
- Python之路 day2 按行读文件
#1. 最基本的读文件方法: # File: readline-example-1.py file = open("sample.txt") while 1: line = fil ...
- java的读文件操作
java读取文件内容,可以作如下理解: 首先获得一个文件句柄,File file = new File():file即为文件句柄.两人之间联通电话网络了,就可以开始打电话了. 通过这条线路读取甲方的信 ...
- Java基础之读文件——使用通道读取混合数据2(ReadPrimesMixedData2)
控制台程序,本例读取Java基础之写文件部分(PrimesToFile2)写入的Primes.txt. 方法二:设置一个任意容量的.大小合适的字节缓冲区并且使用来自文件的字节进行填充.然后整理出缓冲区 ...
- zabbix监控linux文件的一个目录大小
监控linux文件的一个目录大小 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 欢迎加入:高级运维工程师之路 598432640 我们知道,Linux自带的一些监控模板 ...
随机推荐
- css之overflow
也说css之overflow:细探之下有意想不到的结果 2016-11-5 滴滴出行·DDFE 作者:dolymood overflow 是一个非常常用的 CSS 属性,一般来说会认为很简单,其实细究 ...
- How to retrieve instance parameters from an uninstantiated (uninserted) family
The trick to be able to read the default values for instance parameters is to get to the FamilyManag ...
- XAML Region标签功能
XAML本身没有Region标签功能,很郁闷.现在有插件可以实现该功能了! <!-- Region (Any Text You Want) --> Your Code <!-- ...
- BZOJ1950 : [Ceoi2006]Link
显然在最优解中,添加的边都是从$1$出发的. 这个图是一个环套树的结构,对于树的部分,显然叶子节点必须加边. 因此可以自底向上确定树中哪些节点需要加边,同时得到$1$到环上每个点的距离. 对于每个环, ...
- 【转】CentOS6.3安装Broadcom无线网卡驱动
转自: http://blog.csdn.net/jimanyu/article/details/9697833 下面是具体的步骤 一:确定无线网卡的型号,驱动下载 第一步要确定机子的无线网卡型号是什 ...
- webpack入门教程
注:本文内容比较基础,供初学者快速入门参考. 更多详细信息请参考官方文档. 本文同步发布于我的博客,欢迎关注^_^ 1. 安装 npm install -g webpack 2. 基本使用 假设项目文 ...
- 转:Web页面通过URL地址传递参数常见问题及检测方法
Web页面即我们在浏览器中所看到的网页,在Web应用程序中,其页面往往需要进行动态切换和数据交互,页面间的数据常规传递方法有多种,本文主要介绍Web页面处理程序中常见的URL地址参数传递方法,包括概述 ...
- BZOJ 1087 题解【状压DP】
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3112 Solved: 1816[Submit][ ...
- ThinkPHP3.2.3--Linux服务器首页文件index.php路径配置问题
在windows服务器环境下,可以define ('SITE_URL','http://192.168.1.101/'); 但上传到linux服务器环境下不能正常解析,可使用相对路径:define ( ...
- linux vi 删除多行的方法
dd 删除一行 d$ 删除以当前字符开始的一行字符 ndd 删除以当前行开始的n行 dw 删除以当前字符开始的一个字 ndw 删除以当前字符开始的n个字 D 与d$同义 d) 删除到下一句的开始 d} ...