请试一下这个。
我使用的示例是在测试环境中进行的,您可能需要稍微更改代码。
我有一个文本文件,其中包含以下数据:
test
café
áÁÁÁááá
žžœš¥±
ÆÆÖÖÖasØØ
ß
然后我有一个表单,其中输入了一个文件并执行以下代码:
function neatify_files(&$files) {
$tmp = array();
for ($i = 0; $i < count($_FILES); $i++) {
for ($j = 0; $j < count($_FILES[array_keys($_FILES)[$i]]["name"]); $j++) {
$tmp[array_keys($_FILES)[$i]][$j]["name"] = $_FILES[array_keys($_FILES)[$i]]["name"][$j];
$tmp[array_keys($_FILES)[$i]][$j]["type"] = $_FILES[array_keys($_FILES)[$i]]["type"][$j];
$tmp[array_keys($_FILES)[$i]][$j]["tmp_name"] = $_FILES[array_keys($_FILES)[$i]]["tmp_name"][$j];
$tmp[array_keys($_FILES)[$i]][$j]["error"] = $_FILES[array_keys($_FILES)[$i]]["error"][$j];
$tmp[array_keys($_FILES)[$i]][$j]["size"] = $_FILES[array_keys($_FILES)[$i]]["size"][$j];
}
}
return $files = $tmp;
}
if (isset($_POST["submit"])) {
neatify_files($_FILES);
$file = $_FILES["file"][0];
$handle = fopen($file["tmp_name"], "r");
while ($line = fgets($handle)) {
$enc = mb_detect_encoding($line, "UTF-8", true);
if (strtolower($enc) != "utf-8") {
echo "<p>" . (iconv($enc, "UTF-8", $line)) . "</p>";
} else {
echo "<p>$line</p>";
}
}
}
?>
<form action="<?= $_SERVER["PHP_SELF"]; ?>" method="POST" enctype="multipart/form-data">
<input type="file" name="file[]" />
<input type="submit" name="submit" value="Submit" />
</form>
neatify_files
函数是我编写的,目的是使 $_FILES
数组在布局上更加合理。
表单是一个标准表单,只需将数据 POST
到服务器即可。
注意:使用 $_SERVER["PHP_SELF"]
是一种安全风险,请参见此处获取更多信息。
当数据被提交时,我将文件存储在一个变量中。显然,如果您使用了 multiple
属性,则代码看起来不会完全像这样。
$handle
存储文本文件的全部内容,以只读格式;因此使用了 "r"
参数。
$enc
使用 mb_detect_encoding
函数来检测编码(duh)。
起初我遇到了获取正确编码的问题。将 encoding_list
设置为仅使用 UTF-8,并将 strict
设置为 true。
如果编码是 UTF-8,则只需打印该行,否则使用 iconv
函数将其转换为 UTF-8。