php下载utf8编码的csv,用excel打开乱码

服务器上有一个utf8编码的csv文件,经过php下载到本地之后,用excel打开,发现乱码了。原因是这个csv文件没有BOM头。 BOM头是放在UTF-8编码的文件的头部的三个字符(0xEF 0xBB 0xBF,即BOM)占用三个字节,用来标识该文件属于UTF-8编码。 所以在php里面下载utf8编码的csv的时候,需如下方代码所示,添加BOM头: $downloadUrl = '/home/nemo/firDir/test.csv'; $fileName = 'test.csv'; ini_set('memory_limit', '128M'); header('Content-type: application/octet-stream;charset=utf-8'); header('Content-Disposition: attachment; filename=' . $fileName); ob_end_clean(); echo chr(0xEF).chr(0xBB)…

strpos vs mb_strpos

php查找子字符串 在php里面,判断某个字符串里面是否存在某个子串,可以用strpos,官方手册在这里 strpos 如果strpos没找到子串,则会返回FALSE,需要用===来判断是否未找到子串。若找到子串,则会返回该子串第一次出现的位置。 看如下示例代码 $str = 'abcdefg'; $result = strpos($str, 'a'); var_dump($result); if (false == $result) { echo "find failed\n"; } else { echo "find success\n"; } if (false === $result) { echo "find failed\n"; } else { echo "…

使用nginx的XSendfile提升php下载文件性能

我在之前一篇笔记里面写了如何用php下载文件,里面写了两种方法来下载文件 nginx配置直接try_files下载文件 php读取文件之后再输出 对于第二种方法,php-fpm和nginx的内存和IO情况都有飙升。 在传统的文件传输过程中,文件数据经历了以下步骤: 硬盘 -> 内核buffer -> 用户buffer -> socket相关缓冲区 -> 协议栈 而sendfile机制被开启之后,减少了一次文件copy,提升了文件传输性能,文件数据经历的步骤如下: 硬盘 -> 内核buffer -> socket相关缓冲区 -> 协议栈 在当前流行的几个web服务器(apache、nginx、lighttpd等)里面,都有关于sendfile的配置。 下面说说如何使用nginx的XSendfile来提升PHP文件下载性能。 关于nginx的XSendfile的详细内容可以看官方文档 1. nginx开启sendfile 在nginx.conf里面,设置sendfile on表示开启sendfile机制…

php比较两个浮点数是否相等

看下面这段代码,0.9+0.1的相加结果与1进行比较 <?php $a = 0.9; $b = 0.1; $total = $a + $b; var_dump($total); if (1 == $total) { echo "true"; } else { echo "false"; } echo "\n"; if (1.0 == $total) { echo "true"; } else { echo "false"; } ?> 打印结果是:…

php处理base64图片

php将base64转成图片 最近做了一个上传图片的功能。本来的需求是直接上传图片,就可以把图片当成是一个文件。后来又在界面上加了个图片剪裁的功能,前端说传base64比较方便,所以php这边需要将base64转成图片。 看以下示例代码,将base64字符串转成图片,存储起来。 $paramPicBase64 = $_POST['imageBase64']; // 取出图片base64字符串 $paramPicBase64 = str_replace('data:image/png;base64,', '', $paramPicBase64); $paramPicBase64 = str_replace('data:image/jpeg;base64,', '', $paramPicBase64); $paramPicBase64 = str_replace(' ', '+', $paramPicBase64); $image = base64_decode($paramPicBase64); $name = $_POST['name']; // 取出图片的名字,…

php读取excel文件

PHP读取excel文件 我用的是PHPExcel这个库,相关的方法网上都有介绍,我这里主要是记录一下使用过程中遇到的问题 按单元格读取 先来看一段示例代码,这段示例代码是使用PHPExcel按单元格读取excel的内容 $firstfilename = 'test.xlsx'; if ( !file_exists($firstfilename)) { echo "$firstfilename not exits"; exit; } // init excel reader $reader = new PHPExcel_Reader_Excel2007(); // 判断是xlsx还是xls文件 if ( !$reader->canRead($firstfilename)) { $reader = new PHPExcel_Reader_Excel5(); if ( !$reader->canRead($firstfilename)) { exit("cannot read $firstfilename&…

php json转换相关知识

最近在查找一个bug的时候,发现前端传过来的json空对象{},被php转换成了空数组[]存到了数据库里面, 读取并返回给前端的时候,没有做特殊处理,返回了[]给前端,导致一些问题。 所以决定梳理一下php的json转换相关的内容。 索引数组转json 看如下示例代码: $a = ['aa', 'bb', 'cc']; $ret = json_encode($a); var_dump($ret); 打印结果是: string(16) "["aa","bb","cc"]" 可以看到,索引数组被转换成了json数组 关联数组转json 看如下示例代码: $a = [ 'a' => 'aa', 'b' => 'bb', 'c' =>…

php array_search

php array_search 在数组中搜索给定的值,如果成功则返回首个相应的键名 mixed array_search ( mixed $needle , array $haystack [, bool $strict = false ] ) 第一个参数表示要查找的值,第二个参数表示数组,第三个参数表示是否严格比较类型 严格比较类型 vs 不严格比较类型的区别 看一下严格比较类型与不严格比较类型的区别 <?php $arr = ['0', 1, '2', '1']; $result = array_search('1', $arr); var_dump($result); $result = array_search('1', $arr, true); var_dump($result); 打印出来结果如下: int(1) int(…