PHP在UTF8下生成的.csv在excel中乱码问题解决

news/2024/7/21 4:05:19 标签: php, utf8, csv, excel, bom

其实原理很简单,因为office是在windows下的,用的是ansi字符集,所以打开utf8的文件时,中文内容会变成乱码。这时需要告诉excel当前的.csv文件是utf8格式的,他就能正常识别。

解决方式是在创建文件后,在最开头写入一个 UTF8-BOM头标识,excel就知道这个文档用utf8格式打开。

代码如下,请参考输出bom头的这行。

php">$sCsvFile = storage_path('app/csv_vc_cb_'. time() . rand(100, 999) .'.csv'); //csv文件
$fp = fopen($sCsvFile, 'w'); //打开文件
fputs($fp, pack('CCC',0xef,0xbb,0xbf)); //输出bom头
//写行首
$aRow = ['账本id', '虚拟币名', '用户id', '手机号', '真名', '花名', '身份证' , '本期期初额', '本期期末额', '末额', '可核销额'];
fputcsv($fp, $aRow); //输出行
fclose($fp);

再提供一个类文件,可以直接处理读取bom文件时的头剥离,与识别文件的字符集是否为 utf8,直接用吧。

php">/**
 * 字符串BOM检测
 * @author JerryLi
 *
 */
class StringBom{
    /**
     * 移除字符串的BOM
     *
     * @param  string $str 输入字符串
     * @return string 输出字符串
     */
    static public function removeBOM($str)    {
        return self::checkBom($str)?substr($str, 3):$str;
    }
    /**
     * 检查是否带UTF-8的BOM头
     * @param string $str
     * @return boolean
     */
    static public function checkBom($str){
        $str_3 = substr($str, 0, 3);
        return $str_3 == pack('CCC',0xef,0xbb,0xbf);
    }
    /**
     * 检查是否为UTF-8 BOM文件
     * @param string $sFileName 文件名
     * @return boolean
     */
    static public function isBomFile($sFileName){
        $hf = fopen($sFileName, 'r');
        if (false !== $hf){
            $str = fgets($hf,3);
            fclose($str);
            return self::checkBom($str);
        }else{
            return false;
        }
    }
    /**
     * 检查是否为UTF-8字符集
     * @param string $sStr
     * @return boolean
     */
    static public function isUtf8($sStr){
        $sFileType = mb_detect_encoding($sStr , array('UTF-8','GBK','LATIN1','BIG5'));
        return $sFileType === 'UTF-8';
    }
    /**
     * 检测文件是否为UTF-8字符集的文件
     * @param string $sFileName 文件名
     * @return boolean
     */
    static public function isUtf8File($sFileName){
        $hf = fopen($sFileName, 'r');
        if (false !== $hf){
            $str = fgets($hf,3);
            fclose($str);
            return self::isUtf8($str);
        }else{
            return false;
        }
    }
}

 


http://www.niftyadmin.cn/n/1257691.html

相关文章

随机比例算法

随机比例算法 缘起,由于业务需求的需要,需要在保持相对稳定的比例下,生成随机选择数。 应用场景 此类算法常用于限定资源下的,负载均衡算法,抽奖算法等等。关键点在需要保持在某个基数量下,按照比例分布…

Spring @Value SpEl 知识点小记

在JavaBean文件中使用Spring的Value注解获取配置文件.yml或资源文件.properties中 key - value 键值信息 Value("${stu.number}")private String number; 当键值为 number: 00201000331100 number为String 类型 如果value值不为0开头,则数据可以正常解…

java线程共享受限资源 解决资源竞争 thinking in java4 21.3

java线程共享受限资源 解决资源竞争 具体介绍请參阅:thinking in java4 21.3 thinking in java 4免费下载:http://download.csdn.net/detail/liangrui1988/7580155 package org.rui.thread.res; /*** 不对的訪问 资源* author lenovo**/ public abstract class Int…

Bert CNN信息抽取

Github参考代码:https://github.com/Wangpeiyi9979/IE-Bert-CNN 数据集来源于百度2019语言与智能技术竞赛,在上述链接中提供下载方式。 感谢作者提供的代码。 1、信息抽取任务 给定schema约束集合及句子sent,其中schema定义了关系P以及其…

打印从1到最大的n位数

题目描写叙述&#xff1a;给定一个数字N。打印从1到最大的N位数。输入&#xff1a;每一个输入文件仅包括一组測试例子。 对于每一个測试案例&#xff0c;输入一个数字N(1<N<5)。 输出&#xff1a;相应每一个測试案例&#xff0c;依次打印从1到最大的N位数。例子输入&…

php 自动识别 GBK转换UTF8的方法(源码)

不多说了&#xff0c;看标题就明白了&#xff0c;生产环境的代码&#xff0c;需要的拿去。 如果用得上&#xff0c;感恩您的打赏 检查是否为UTF-8字符集检查是否为UTF-8 BOM文件将GBK文件转换成UTF8文件检查是否带UTF-8的BOM头移除字符串的BOM<?php/*** 字符串BOM检测以及…

C++运行cmd命令或exe

1、system(testapp.exe)&#xff1a;这样运行会默认有调试窗口&#xff0c;即黑色的dos窗口。 2、WinExec("testapp.exe", SW_HIDE): 同样可以运行exe程序&#xff0c;同时隐藏调试窗口。

Bert机器问答模型QA(阅读理解)

Github参考代码&#xff1a;https://github.com/edmondchensj/ChineseQA-with-BERT https://zhuanlan.zhihu.com/p/333682032 数据集来源于DuReader Dataset&#xff0c;即百度经验上的问答&#xff0c;在上述链接中提供下载方式。 感谢作者提供的代码。 1、数据集处理 &a…