如何在php中将文件转换为UTF-8?

Obl*_*der 7 php encoding utf-8

是否可以将文件转换为UTF-8?

如果我在提交后有权访问该文件

$_FILES['file']['tmp_name']
Run Code Online (Sandbox Code Playgroud)

注意:用户可以使用任何类型的字符集上传CSV文件,我通常会遇到一个未知的8位字符集.

我试试

$row = array();
$datas = file($_FILES['file']['tmp_name']);
foreach($datas as $data) {
    $data = mb_convert_encoding($data, 'UTF-8');
    $row[] = explode(',', $data);
}
Run Code Online (Sandbox Code Playgroud)

但问题是,这段代码删除了单引号等特殊字符.

我的第一个问题是htmlspecialchars删除数组内的值?

我把它作为补充信息.感谢那些可以提供帮助的人!

Jue*_*gen 5

function convert_file_to_utf8($source, $target) {
    $content=file_get_contents($source);
    # detect original encoding
    $original_encoding=mb_detect_encoding($content, "UTF-8, ISO-8859-1, ISO-8859-15", true);
    # now convert
    if ($original_encoding!='UTF-8') {
        $content=mb_convert_encoding($content, 'UTF-8', $original_encoding);

    }
    $bom=chr(239) . chr(187) . chr(191); # use BOM to be on safe side
    file_put_contents($target, $bom.$content);
}
Run Code Online (Sandbox Code Playgroud)


Jus*_*rty 2

试试这个。
\n我使用的示例是我在测试环境中所做的事情,您可能需要稍微更改代码。

\n\n

我有一个文本文件,其中包含以下数据:

\n\n
test\ncaf\xc3\xa9\n\xc3\xa1\xc3\x81\xc3\x81\xc3\x81\xc3\xa1\xc3\xa1\xc3\xa1\n\xc5\xbe\xc5\xbe\xc5\x93\xc5\xa1\xc2\xa5\xc2\xb1\n\xc3\x86\xc3\x86\xc3\x96\xc3\x96\xc3\x96as\xc3\x98\xc3\x98\n\xc3\x9f\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我有一个表单,它接受文件输入并执行以下代码:

\n\n
function neatify_files(&$files) {\n    $tmp = array();\n    for ($i = 0; $i < count($_FILES); $i++) {\n        for ($j = 0; $j < count($_FILES[array_keys($_FILES)[$i]]["name"]); $j++) {\n            $tmp[array_keys($_FILES)[$i]][$j]["name"] = $_FILES[array_keys($_FILES)[$i]]["name"][$j];\n            $tmp[array_keys($_FILES)[$i]][$j]["type"] = $_FILES[array_keys($_FILES)[$i]]["type"][$j];\n            $tmp[array_keys($_FILES)[$i]][$j]["tmp_name"] = $_FILES[array_keys($_FILES)[$i]]["tmp_name"][$j];\n            $tmp[array_keys($_FILES)[$i]][$j]["error"] = $_FILES[array_keys($_FILES)[$i]]["error"][$j];\n            $tmp[array_keys($_FILES)[$i]][$j]["size"] = $_FILES[array_keys($_FILES)[$i]]["size"][$j];\n        }\n    }\n    return $files = $tmp;\n}\n\nif (isset($_POST["submit"])) {\n    neatify_files($_FILES);\n    $file = $_FILES["file"][0];\n\n    $handle = fopen($file["tmp_name"], "r");\n    while ($line = fgets($handle)) {\n        $enc = mb_detect_encoding($line, "UTF-8", true);\n        if (strtolower($enc) != "utf-8") {\n            echo "<p>" . (iconv($enc, "UTF-8", $line)) . "</p>";\n        } else {\n            echo "<p>$line</p>";\n        }\n    }\n}\n?>\n<form action="<?= $_SERVER["PHP_SELF"]; ?>" method="POST" enctype="multipart/form-data">\n    <input type="file" name="file[]" />\n    <input type="submit" name="submit" value="Submit" />\n</form>\n
Run Code Online (Sandbox Code Playgroud)\n\n

我编写该函数neatify_files是为了使$_FILES数组的布局更加符合逻辑。

\n\n

该表单是一种标准表单,只需POST将数据发送到服务器即可。
\n注意:使用$_SERVER["PHP_SELF"]存在安全风险,请参阅此处了解更多信息

\n\n

发布数据后,我将文件存储在变量中。显然,如果您使用该multiple属性,您的代码将不会像这样。

\n\n

$handle以只读格式存储文本文件的全部内容;因此这个"r"论点。

\n\n

$enc使用该mb_detect_encoding函数来检测编码(废话)。
\n起初我在获取正确的编码方面遇到了麻烦。设置encoding_list为仅使用 UTF-8,并设置strict为 true。

\n\n

如果编码是 UTF-8,那么我只需打印该行,如果不是,我使用该iconv函数将其转换为 UTF-8。

\n