Search code examples
phpcsvfgetcsv

Character data not rendering correctly using PHP fgetcsv (character set issue)


File csv

Page with results

Code:

<?php
$file_name = 'test.csv';

if (($handle_f = fopen($file_name, "r")) !== FALSE)
{

while ( ($data_f = fgetcsv($handle_f, 20000, ";"))!== FALSE) {
echo Name - '.$data_f[0].', City - '.$data_f[1].', Adress - '.$data_f[2].', Site - '.$data_f[3].'<br>';
}

fclose($handle_f);
} else {$err = 1; echo "File not open";}
?>

For example in result i would be get next(for example first 2 rows):

Name - Сибвез, City - Абакан, Adress - ул. Советская, 44, Site - www.sibvez.ru
Name - Быттехника, City - Абакан, Adress - ул. Дружбы народов, д. 52, Site - www.sibvez.ru

But now in results first 2 rows next:

Name - , City - , Adress - . Советская, 44, Site - www.sibvez.ru
Name - , City - , Adress - . Дружбы народов, д. 52, Site - http://www.bytech.ru

Tell me please why i cannt get correctly results?


Solution

  • you are need set correct locale - use setlocale(LC_ALL, 'ru_RU.CP1251');

    Full code:

    setlocale(LC_ALL, 'ru_RU.CP1251');
    echo strtoupper('SERVER USE LOCALE ru_RU.CP1251');
    
    $file_name = 'test.csv';
    
    if (($handle_f = fopen($file_name, "r")) !== FALSE)
    {
    
    while ( ($data_f = fgetcsv($handle_f, 20000, ";"))!== FALSE) {
    echo 'Name - '.$data_f[0].', City - '.$data_f[1].', Adress - '.$data_f[2].', Site - '.$data_f[3].'<br>';
    }
    
    fclose($handle_f);
    } else {$err = 1; echo "File not open";}
    

    Reference for setlocale: https://www.php.net/manual/en/function.setlocale.php