des questions similaires:
Some characters in CSV file are not read during PHP fgetcsv(),
fgetcsv() ignores special characters when they are at the beginning of linefgetcsv() supprime les caractères avec des signes diacritiques (c'est-à-dire non-ASCII) - comment résoudre ce problème?
Mon application a une forme où les utilisateurs peuvent télécharger un fichier CSV (ses 5 utilisateurs internes ont toujours téléchargé un fichier valide - délimité par des virgules , quoted, records finit par LF), et le fichier est ensuite importé dans une base de données en utilisant PHP:
$fhandle = fopen($uploaded_file,'r');
while($row = fgetcsv($fhandle, 0, ',', '"', '\\')) {
print_r($row);
// further code not relevant as the data is already corrupt at this point
}
Pour raisons que je ne peux pas changer, les utilisateurs téléchargent le fichier codé dans le charset Windows-1250
- un codage de caractères de 8 bits à un octet.
Le problème: et certains caractères (pas tous!) Au-delà de 127 ("ASCII étendu") sont supprimés dans fgetcsv()
. données Exemple:
"15","Ústav"
"420","Špičák"
"7","Tmaň"
devient
Array (
0 => 15
1 => "stav"
)
Array (
0 => 420
1 => "pičák"
)
Array (
0 => 7
1 => "Tma"
)
(Notez que č
est conservée, mais Ú
est abandonné)
La documentation fgetcsv dit que « depuis 4.3.5 fgetcsv() est maintenant binary safe ", mais on dirait que ce n'est pas le cas. Est-ce que je fais quelque chose de mal, ou cette fonction est-elle cassée et je devrais chercher une manière différente d'analyser CSV?
Je vais répondre tout de suite, ce bug m'a mordu plus tôt et a trouvé la cause; Je voulais partager cela avec SO, car le bug est * subtil *. – Piskvor
(juste pour clarifier, Win-1250 est juste le codage d'entrée.Les données sont ensuite converties et stockées dans la base de données comme UTF-8, cette partie fonctionne bien.Les données initiales lues était le problème.) – Piskvor