PHP检测文件编码格式

时间:2022-05-31 17:33:40

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;
}