Çizginin başında olduğunda fgetcsv () özel karakterleri dikkate almaz!

4 Cevap php

Ben bir CSV dosyasını kabul eder ve bir diziye her satır okur basit bir komut dosyası var. Sonra döngü ilk satırdaki (benim durumumda bir anketin sorularını tutar), her sütun aracılığıyla ve ben bunları yazdırabilirsiniz. Anket Fransız olduğunu ve bir sorunun ilk karakteri özel bir karakter (é, ê, ç, vb) fgetcsv sadece bunu atlar olduğunda.

Bu ilk karakter olan sadece değerinin ortasında özel karakterler etkilenmez.

Ben bu hata ayıklamak için çalıştı ama ben şaşkın. Ben dosya içeriği ile bir var_dump yaptım ve karakterler kesinlikle vardır:

var_dump(utf8_encode(file_get_contents($_FILES['csv_file']['tmp_name'])));

Ve işte benim kod:

if(file_exists($_FILES['csv_file']['tmp_name']) && $csv = fopen($_FILES['csv_file']['tmp_name'], "r"))
    {
        $csv_arr = array();

        //Populate an array with all the cells of the CSV file
        while(!feof($csv))
        {
            $csv_arr[] = fgetcsv($csv);
        }

        //Close the file, no longer needed
        fclose($csv);

        // This should cycle through the cells of the first row (questions)
        foreach($csv_arr[0] as $question)
        {
            echo utf8_encode($question) . "<br />";
        }

    }

4 Cevap

Eğer aramadan önce doğru yerel ayarı Hazır fgetcsv()?

setlocale(LC_ALL, 'fr_FR.UTF-8');

Aksi takdirde, fgetcsv() multi-byte güvenli değildir.

Mevcut yerel listenizde görünen bir şey olarak ayarlayın emin olun. (Kesinlikle debian) linux üzerinde Eğer yaparak görebilirsiniz

locale -a

Sen gibi bir şey almak gerekir ...

C
en_US.utf8
POSIX

UTF8 desteği ucunda utf8 ile bir kodlama seçin. Lütfen giriş başka bir şey ile kodlanmış Eğer uygun yerel ayarı kullanmanız gerekir - ama OS ilk bunu desteklediğinden emin olun.

Eğer sisteminizde mevcut olmayan bir ayara ayarlayın eğer size yardımcı olmayacaktır.

Bu davranış, bir bug report bunun için dava var, ama görünüşe göre bu isn't a bug.

Biz LANG C için ayarlanır ve bu tür değerleri tırnak sarılı sağlayarak çevresinde çalıştı ile aynı sonucu gördüm. Örneğin, hat

a,"a",é,"é",óú,"óú",ó&ú,"ó&ú"

geçirildi aşağıdaki dizisi oluşturur fgetcsv(),

array (
  0 => 'a',
  1 => 'a',
  2 => '',
  3 => 'é',
  4 => '',
  5 => 'óú',
  6 => '&ú',
  7 => 'ó&ú',
)

Tabii ki, bunları iki katına tarafından herhangi bir değer tırnak işaretleri kaçmak gerekir, ama bu eksik karakterleri tamiri çok daha az güçlük bulunuyor.

İşin garibi, bu UTF-8 ve girdi dosyası için cp1252 kodlamaları hem olur.