I have a simple script that accepts a CSV file and reads every row into an array. I then cycle through each column of the first row (in my case it holds the questions of a survey) and I print them out. The survey is in french and whenever the first character of a question is a special character (é,ê,ç, etc) fgetcsv simply omits it.
Special characters in the middle of the value are not affected only when they are the first character.
I tried to debug this but I am baffled. I did a var_dump with the content of the file and the characters are definitely there:
var_dump(utf8_encode(file_get_contents($_FILES['csv_file']['tmp_name'])));
And here's my code:
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 />";
}
}
Are you setting your locale correctly before calling fgetcsv()
?
setlocale(LC_ALL, 'fr_FR.UTF-8');
Otherwise, fgetcsv()
is not multi-byte safe.
Make sure that you set it to something that appears in your list of available locales. On linux (certainly on debian) you can see this by doing
locale -a
You should get something like...
C
en_US.utf8
POSIX
For UTF8 support pick an encoding with utf8 on the end. If your input is encoded with something else you'll need to use the appropriate locale - but make sure your OS supports it first.
If you set the locale to a locale which isn't available on your system it won't help you.