it-swarm.com.de

Wie konvertiert man eine Datei in php in UTF-8?

Kann ich an meinem Ende eine Datei in UTF-8 konvertieren?

Wenn ich nach der Einreichung mit auf die Datei zugreifen kann

$_FILES['file']['tmp_name']

Hinweis: Der Benutzer kann eine CSV-Datei mit einem beliebigen Zeichensatz hochladen. Normalerweise stelle ich einen unbekannten 8-Bit-Zeichensatz vor.

Ich versuche

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

Das Problem ist jedoch, dass dieser Code Sonderzeichen wie einfaches Anführungszeichen entfernt.

Meine erste Frage ist htmlspecialchars den Wert innerhalb des Arrays entfernen?

Ich habe es für zusätzliche Informationen gestellt. Danke für die, die helfen können!

7
Oblivion Coder

bevor Sie es in UTF-8 konvertieren können, müssen Sie wissen, um welchen Zeichensatz es sich handelt. Wenn Sie das nicht herausfinden können, können Sie es nicht in einer vernünftigen Art und Weise in UTF-8 ... eine verrückte Methode, um es in utf-8 zu konvertieren. Wenn die Kodierung nicht bestimmt werden kann, entfernt einfach alle Bytes, die in utf-8 nicht gültig sind, und entfernt diese möglicherweise als Rückfall ...

warnung, ungeprüfter Code (ich bin plötzlich in Eile), kann aber in etwa so aussehen: 

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

Probieren Sie es aus.
Das Beispiel, das ich verwendet habe, war etwas, das ich in einer Testumgebung gemacht habe. Möglicherweise müssen Sie den Code leicht ändern.

Ich hatte eine Textdatei mit folgenden Daten in:

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

Dann hatte ich ein Formular, das eine Dateieingabe übernahm und folgenden Code ausführte:

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>

Die Funktion neatify_files ist etwas, das ich geschrieben habe, um das $_FILES-Array in seinem Layout logischer zu gestalten.

Das Formular ist ein Standardformular, das einfach die Daten an den Server POSTs übermittelt.
Hinweis: Die Verwendung von $_SERVER["PHP_SELF"] ist ein Sicherheitsrisiko. Weitere Informationen finden Sie hier .

Wenn die Daten gepostet werden, speichere ich die Datei in einer Variablen. Wenn Sie das multiple-Attribut verwenden, sieht Ihr Code natürlich nicht ganz so aus.

$handle speichert den gesamten Inhalt der Textdatei in einem schreibgeschützten Format. daher das "r"-Argument.

$enc verwendet die Funktion mb_detect_encoding , um die Kodierung zu ermitteln (duh).
Zuerst hatte ich Probleme, die richtige Kodierung zu erhalten. Festlegen von encoding_list zur Verwendung von nur UTF-8 und Setzen von strict auf true.

Wenn die Kodierung UTF-8 ist, drucke ich einfach die Zeile, andernfalls habe ich sie mit der Funktion iconv in UTF-8 konvertiert.

2
JustCarty

sie können den Dateitext mithilfe der folgenden Anweisungen in Binärdaten konvertieren

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

nachdem Sie die Daten in Binärdateien konvertiert haben, ändern Sie einfach den Text in PHP-Methode mb_convert_encoding ($ fileText, "UTF-8").  

1
A.D.

Lass uns das versuchen:

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

Verwendungszweck:

$content = file_get_contents($_FILES['file']['tmp_name']);
$content = encode_utf8($content);

$rows = explode("\n", $content);
foreach ($rows as $row) {
    print_r($row);
}
1
odan
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);
}
0
Juergen