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 ]]]] )
-
string $filename
手册上说是要读取文件名,但其实还带着文件路径的,如
$_FILES["file_name"]["tmp_name"]
。 -
bool $use_include_path
是否使用include_path,这里的include_path可理解为环境变量。可通过set_include_path()重写(可使用PATH_SEPARATOR将set的重写变为扩展添加功能),也可以通过php.ini设置。
-
resource $context
使用stream_context_create()创建的有效上下文文件流。这里涉及到PHP流的概念我还没弄清楚,日后弄清楚了再说。
-
int $offset
文件开始读取的位置。
-
int $maxlen
读取的字节数。
用以转换string的编码格式的函数mb_convert_encoding()
string mb_convert_encoding ( string $str , string $to_encoding [, mixed $from_encoding = mb_internal_encoding() ] )
-
string $str
要编码的string
-
string $to_encoding
str要转换成的编码类型
-
mixed $from_encoding
在转换前通过字符代码名称来指定。它可以是一个 array 也可以是逗号分隔的枚举列表。 如果没有提供 from_encoding,则会使用内部(internal)编码。
用以计算MD5散列值的函数md5()
string md5 ( string $str [, bool $raw_output = false ] )
-
string $str
原始字符串
-
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;
}