如何在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?

我把它的其他信息。感谢那些可以帮助的人!

+0

可以试试的任何示例文件? –

+4

你可能会在这里找到你的答案:https://*.com/a/7980354/1348344 –

+0

所以最好的解决方案是检测它是否包含utf-8? –

试试看。
我用过的例子是我在测试环境中做的事,你可能需要稍微改变一下代码。

我与在下列数据的文本文件:

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”) ;

+1

为什么要大写PHP关键字? – zessx

+0

不是问题,但这有点奇怪。这是否意味着你从不使用编辑器的自动完成和片段? – zessx

在将其转换为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); 
}