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删除数组内的值?
我把它作为补充信息.感谢那些可以提供帮助的人!
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)
试试这个。
\n我使用的示例是我在测试环境中所做的事情,您可能需要稍微更改代码。
我有一个文本文件,其中包含以下数据:
\n\ntest\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\nfunction 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
数组的布局更加符合逻辑。
该表单是一种标准表单,只需POST
将数据发送到服务器即可。
\n注意:使用$_SERVER["PHP_SELF"]
存在安全风险,请参阅此处了解更多信息。
发布数据后,我将文件存储在变量中。显然,如果您使用该multiple
属性,您的代码将不会像这样。
$handle
以只读格式存储文本文件的全部内容;因此这个"r"
论点。
$enc
使用该mb_detect_encoding
函数来检测编码(废话)。
\n起初我在获取正确的编码方面遇到了麻烦。设置encoding_list
为仅使用 UTF-8,并设置strict
为 true。
如果编码是 UTF-8,那么我只需打印该行,如果不是,我使用该iconv
函数将其转换为 UTF-8。
归档时间: |
|
查看次数: |
7458 次 |
最近记录: |