如何在PHP中将文件转换为UTF-8?
是否可以将文件转换为UTF-8?如何在PHP中将文件转换为UTF-8?
如果我有提交后对文件的访问
$_FILES['file']['tmp_name']
注:用户可以上传CSV文件与任何类型的字符集,我通常会遇到未知的8位字符集。
我尝试
$row = array();
$datas = file($_FILES['file']['tmp_name']);
foreach($datas as $data) {
$data = mb_convert_encoding($data, 'UTF-8');
$row[] = explode(',', $data);
}
但问题是,这个代码删除,如单引号的特殊字符。
我的第一个问题是htmlspecialchars remove the value inside the array?
我把它的其他信息。感谢那些可以帮助的人!
试试看。
我用过的例子是我在测试环境中做的事,你可能需要稍微改变一下代码。
我与在下列数据的文本文件:
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
阵列的布局更合理。
该表格是一种标准格式,只需将数据发送到服务器即可。
注意:使用$_SERVER["PHP_SELF"]
存在安全风险,see here for more。
当数据发布时,我将文件存储在一个变量中。显然,如果你使用multiple
属性,你的代码看起来不会像这样。
$handle
以只读格式存储文本文件的全部内容;因此有"r"
的说法。使用mb_detect_encoding
函数来检测编码(duh)。
起初我在获得正确的编码方面遇到了问题。将encoding_list
设置为仅使用UTF-8,并将strict
设置为true。
如果编码是UTF-8,那么我只需打印该行,如果它没有使用iconv
函数将其转换为UTF-8。
您可以将文件文本转换成二进制数据通过以下
FUNCTION bin2text($bin_str)
{
$text_str = '';
$chars = EXPLODE("\n", CHUNK_SPLIT(STR_REPLACE("\n", '', $bin_str), 8));
$_I = COUNT($chars);
FOR($i = 0; $i < $_I; $text_str .= CHR(BINDEC($chars[$i])), $i );
RETURN $text_str;
}
FUNCTION text2bin($txt_str)
{
$len = STRLEN($txt_str);
$bin = '';
FOR($i = 0; $i < $len; $i )
{
$bin .= STRLEN(DECBIN(ORD($txt_str[$i]))) < 8 ? STR_PAD(DECBIN(ORD($txt_str[$i])), 8, 0, STR_PAD_LEFT) : DECBIN(ORD($txt_str[$i]));
}
RETURN $bin;
}
将数据转换成二进制后,您只需将文本更改为PHP方法mb_convert_encoding($ FILETEXT,“UTF-8”) ;
在将其转换为utf-8之前,您需要知道它是什么字符集。 如果你无法弄清楚,你不能以任何理智的方式将其转换为utf8 ..然而,如果编码无法确定,将其转换为utf-8的一种疯狂方法是,将 简单地剥离这不正好是UTF-8格式的任何有效字节,你 也许能够使用它作为后备...
警告,未经测试的代码(有急事突然IM),但看起来像这样的:
foreach ($datas as $data) {
$encoding = guess_encoding ($data);
if (empty ($encoding)) {
// encoding cannot be determined...
// as a fallback, we simply strip any bytes that isnt valid utf-8...
// obviously this isn't a reliable conversion scheme.
// also this could probably be improved
$data = iconv ("ASCII", "UTF-8//TRANSLIT//IGNORE", $text);
} else {
$data = mb_convert_encoding ($data, 'UTF-8', $encoding);
}
$row [] = explode (',', $data);
}
function guess_encoding(string $str): string {
$blacklist = array (
'pass',
'auto',
'wchar',
'byte2be',
'byte2le',
'byte4be',
'byte4le',
'BASE64',
'UUENCODE',
'HTML-ENTITIES',
'7bit',
'8bit'
);
$encodings = array_flip (mb_list_encodings());
foreach ($blacklist as $tmp) {
unset ($encodings [$tmp]);
}
$encodings = array_keys ($encodings);
$detected = mb_detect_encoding ($str, $encodings, true);
return (string) $detected;
}
让我们试试这个:
function encode_utf8($data)
{
if ($data === null || $data === '') {
return $data;
}
if (!mb_check_encoding($data, 'UTF-8')) {
return mb_convert_encoding($data, 'UTF-8');
} else {
return $data;
}
}
用法:
$content = file_get_contents($_FILES['file']['tmp_name']);
$content = encode_utf8($content);
$rows = explode("\n", $content);
foreach ($rows as $row) {
print_r($row);
}
可以试试的任何示例文件? –
你可能会在这里找到你的答案:https://*.com/a/7980354/1348344 –
所以最好的解决方案是检测它是否包含utf-8? –