2017-10-20 2 views
7

私の最後にファイルを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://stackoverflow.com/a/7980354/1348344 –

+0

これはutf-8が含まれているかどうかを検出するのに最適な解決策ですか? –

答えて

2

これを試してください。
私が使用した例は、テスト環境で行っていたものでしたが、コードを少し変更する必要があります。

私は、次のデータをテキストファイルを持っていた:機能neatify_files

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> 

です:その後、私は、ファイルの入力を取り、次のコードを実行し、フォームが持っていた

test 
café 
áÁÁÁááá 
žžœš¥± 
ÆÆÖÖÖasØØ 
ß 

私はレイアウトの中でより論理的な配列を$_FILESにするために書きました。

このフォームは、サーバにデータを送信するだけの標準形式です。
注:$_SERVER["PHP_SELF"]を使用するとセキュリティリスクがあります。see here for more

データがポストされると、変数にファイルが格納されます。明らかに、multiple属性を使用している場合、コードはこのようには見えません。

$handleは、テキストファイルの内容全体を読み取り専用形式で格納します。したがって、引数は"r"です。

$encは、mb_detect_encoding機能を使用してエンコード(duh)を検出します。
最初は正しいエンコーディングを得ることに問題がありました。 encoding_listをUTF-8のみを使用するように設定し、strictをtrueに設定します。

エンコードがUTF-8の場合は、iconv機能を使用してUTF-8に変換しなかった場合は、単に行を印刷します。

1

あなたは、単にPHPの方法mb_convert_encodingにテキストを変更バイナリにデータを変換した後、次の

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; 
} 

を使用してバイナリデータにファイルのテキストに変換することができます($ FILETEXT、「UTF-8」) ;

+1

なぜPHPのキーワードを大文字にしますか? – zessx

+0

問題はありませんが、これはちょっと変です。これは編集者のオートコンプリートとスニペットを使用しないことを意味しますか? – zessx

2

utf-8に変換する前に、それがどの文字セットであるかを知る必要があります。 あなたがそれを理解できなければ、あなたはそれをutf8に変換することはできません。 しかし、それをutf-8に変換するための狂気の方法は、エンコーディングが決定できない場合、 はutf-8で有効ではないバイトは、 をフォールバックとして使用できる可能性があります。

警告、テストされていないコード(突然、急いでいますが、これは:

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; 
} 
1

のは、これを試してみましょう:

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); 
} 
関連する問題