PHP使用变音符号导入CSV

时间:2017-10-17 11:01:52

标签: php csv character-encoding

我有一个网站,我的用户可以上传文件。此文件包含一些德语变音符号(如ö和ä)并且是latin_1编码的。现在我需要将此文件转换为UTF-8,因为我的数据库使用了这个字符集。

我使用以下代码:

        $csvFile = fopen($_FILES['file']['tmp_name'], 'r');
        //parse data from csv file line by line
        while(($line = fgetcsv($csvFile, 0, "\t")) !== FALSE){
                $dbupload->query("INSERT INTO db (a, b, c) 
                             VALUES ('".$line[0]."', '".$line[3]."', '".$line[1]."')");
            }
        }

        //close opened csv file
        fclose($csvFile);

如果我使用此代码并导入latin_1文件,PHP会跳过包含变音符号的每一行。

我该怎么办?

PS:文件直接从前端(用户使用的页面)传递到处理它的文件。

2 个答案:

答案 0 :(得分:1)

首先,不要将用户上传的数据直接传递给数据库!请改用pdo statements

还要确保文件中包含哪种编码。在示例中,我使用ISO-8859-1,但我可能会误解你。

以下是使用iconv的代码的一部分:

$csvFile = fopen($_FILES['file']['tmp_name'], 'r');

//parse data from csv file line by line
while(($line = fgetcsv($csvFile, 0, "\t")) !== false) {
    foreach ($line as $key => $value) {
        $line[$key] = iconv('ISO-8859-1', 'UTF-8', $value); //but be sure in your charset name
    }
    //do not pass data from user upload directly to database!
    //use pdo or addslashes at least
    $dbupload->query("INSERT INTO db (a, b, c) VALUES ('".addslashes($line[0])."', '".addslashes($line[3])."', '".addslashes($line[1])."')");
}

//close opened csv file
fclose($csvFile);

有关更多示例,请参阅iconv文档。

答案 1 :(得分:0)

如果你查看这个列表here,你会看到包含Umlaute,其中提到它们可以进行解码。 如上所述,使用UTF-8编码保存文件可以解决问题。否则文件将不会自动执行,这就是您遇到问题的原因。