PHP检测文件编码格式

本文介绍了使用PHP检测文件编码格式的思路和方法,通过file_get_contents()读取文件并强制转码,然后与原文件比较,利用mb_convert_encoding()进行编码转换,以及结合md5()函数验证编码的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

7/25/2017 PM

实现思路

通过file_get_contents()将源文件强制转码,再将结果与原文件比较,若相同则强制转码所使用的编码方式便是源文件的编码方式。

主要函数

用以把整个文件读入到一个string中的函数file_get_contents()

string file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] )
  1. string $filename

    手册上说是要读取文件名,但其实还带着文件路径的,如$_FILES["file_name"]["tmp_name"]

  2. bool $use_include_path

    是否使用include_path,这里的include_path可理解为环境变量。可通过set_include_path()重写(可使用PATH_SEPARATOR将set的重写变为扩展添加功能),也可以通过php.ini设置。

  3. resource $context

    使用stream_context_create()创建的有效上下文文件流。这里涉及到PHP流的概念我还没弄清楚,日后弄清楚了再说。

  4. int $offset

    文件开始读取的位置。

  5. int $maxlen

    读取的字节数。


用以转换string的编码格式的函数mb_convert_encoding()

string mb_convert_encoding ( string $str , string $to_encoding [, mixed $from_encoding = mb_internal_encoding() ] )
  1. string $str

    要编码的string

  2. string $to_encoding

    str要转换成的编码类型

  3. mixed $from_encoding

    在转换前通过字符代码名称来指定。它可以是一个 array 也可以是逗号分隔的枚举列表。 如果没有提供 from_encoding,则会使用内部(internal)编码。


用以计算MD5散列值的函数md5()

string md5 ( string $str [, bool $raw_output = false ] )
  1. string $str

    原始字符串

  2. bool $raw_output

    如果可选的 raw_output 被设置为 TRUE,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。

代码

$TMP_ADD = $_FILES["file_name"]["tmp_name"];
$newfile = fopen("$TMP_ADD", r);
echo var_dump($newfile) . "<br>";
//判断是否接收到了文件
if (!$newfile) {
    echo "<p>No orders pending. Pleas try again later.</p><br>";
}
//判断文件编码格式,参数为文件地址
function detectEncoding (string $address)
{
//  可能的编码格式
    $encoding_type_list = array('GBK', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'ISO-8859-1', 'GB2312');
//  根据文件地址获取内容
    $file_contents = file_get_contents($address);
//  遍历编码格式
    foreach ($encoding_type_list as $encoding_type) {
        $file_contents_encoded = mb_convert_encoding($file_contents, $encoding_type, $encoding_type);
        if (md5($file_contents) == md5($file_contents_encoded)) {
            return $encoding_type;
        }
    }
    return null;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值