2012-11-07 9 views
4

J'utilise Excel 2010 professionnel plus pour créer un fichier Excel. Plus tard, j'essaie de l'exporter en tant que fichier .csv UTF-8. Je le fais en l'enregistrant au format CSV (symbole séparé ..... sry Je ne connais pas le libellé exact ici mais je n'ai pas la version anglaise et je crains qu'il soit traduit différemment de 1: 1). Là je clique sur tools-> weboptions et sélectionne unicode (UTF-8) comme encodage. L'exemple .csv est la suivante:Excel csv exporter dans un fichier php avec fgetcsv

ID;englishName;germanName 
1;Austria;Österreich 

Jusqu'à présent, si bon, mais si j'ouvre le fichier maintenant avec mon code php:

header('Content-Type: text/html; charset=UTF-8'); 
iconv_set_encoding("internal_encoding", "UTF-8"); 
iconv_set_encoding("output_encoding", "UTF-8"); 
setlocale(LC_ALL, 'de_DE.utf8'); 
$fp=fopen($filePathName,'r'); 
while (($dataRow= fgetcsv($fp,0,";",'"'))!==FALSE) 
{ 
    print_r($dataRow); 
} 
  • je reçois: sterreich suite sur l'écran (comme c'est "l'erreur" j'ai coupé toutes les autres parties du résultat).
  • Si j'ouvre le fichier avec Notepad ++ et regarde l'encodage je vois "ANSI" au lieu de UTF-8.
  • Si je change l'encodage dans notepad ++ en UTF8 .... les ö, ä, ... sont remplacés par des caractères spéciaux, que je dois corriger manuellement.

Si je vais un autre itinéraire et créer un nouveau fichier UTF-8 avec notedpad ++ et mis dans les mêmes données que dans le fichier Excel je suis montré « Österreich » à l'écran lorsque je l'ouvre avec le fichier php.

Maintenant, la question que j'ai est, pourquoi ne fonctionne-t-elle pas avec Excel, donc je fais quelque chose de mal ici? Ou suis-je en train de négliger quelque chose?

Edit: Comme le programme sera à la fin être installé sur les serveurs Windows fournis par les clients, une solution est nécessaire là où il est pas nécessaire d'installer des outils supplémentaires (bibliothèques php, ... sont ok, mais devoir installer un vm-ware ou cygwin, ... n'est pas). Il n'y aura pas non plus d'excel (ou bureau) installé localement sur le serveur car le client pourra télécharger le fichier .csv via une boîte de dialogue de téléchargement de fichier (la boîte de dialogue elle-même ne fait pas partie du problème, car je savoir comment gérer ceux-ci et en plus le problème lui-même j'ai trébuché sur quand j'ai créé un fichier Excel et l'ai converti en .csv sur un testmachine où Excel était installé localement).

Tnx

Répondre

10

From PHP DOC

paramètres régionaux est pris en Accou nt par cette fonction. Si LANG est par exemple en_US.UTF-8, les fichiers au format codés sur un octet sont lus incorrectement par cette fonction.

Vous pouvez

header('Content-Type: text/html; charset=UTF-8'); 
$fp = fopen("log.txt", "r"); 
echo "<pre>"; 
while (($dataRow = fgetcsv($fp, 1000, ";")) !== FALSE) { 
    $dataRow = array_map("utf8_encode", $dataRow); 
    print_r($dataRow); 
} 

Sortie

Array 
(
    [0] => ID 
    [1] => englishName 
    [2] => germanName 
) 
Array 
(
    [0] => 1 
    [1] => Austria 
    [2] => Österreich 
) 
+0

Le array_map était la solution tnx. Je ne pensais pas que j'aurais à le cartographier explecitely encore comme UTF-8 si j'ai déjà dit au programme que c'est UTF-8 ce que je lis. (phénomène intéressant ..... en plus d'exceller à l'exportation encore comme ANSI) Tnx à nouveau. – Thomas

+0

Vous êtes les bienvenus à tout moment .... – Baba

1

Je ne sais pas pourquoi Excel génère un fichier ANSI au lieu de UTF-8 (comme vous pouvez le voir dans Notepad ++), mais si tel est le cas, vous pouvez convertir le fichier en utilisant iconv :

iconv --from-code = ISO-8859-1 --to-code = UTF-8 my_csv_file.csv> my_csv_file_utf8.csv

+1

Y at-il une autre méthode pour le faire sans compter sur les commandes unix? (L'application doit pouvoir fonctionner sur plusieurs machines Windows différentes sans avoir besoin d'installer des outils supplémentaires, donc avoir à installer un outil sur ces serveurs qui me permet d'utiliser des commandes unix n'est pas vraiment quelque chose de bien). – Thomas

0

D'après ce que vous dites, je soupçonne Excel écrit un fichier UTF-8 without BOM, ce qui rend deviner que le codage est utf-8 un peu plus délicat. Vous pouvez confirmer ce diagnostic si les caractères apparaissent correctement dans Notepad ++ lorsque vous appuyez sur Format->Encode in UTF-8 (without BOM) (au lieu de Format->Convert to UTF-8 (without BOM)).

Et êtes-vous sûr que chaque utilisateur va utiliser UTF-8? Il me semble que vous avez besoin de quelque chose qui devine un peu de votre véritable encodage d'entrée. Par "intelligent", je veux dire que cette estimation reconnaît UTF-8 sans nomenclature.

Pour couper à la chasse, je ferais quelque chose comme ça:

$f = fopen('file.csv', 'r'); 

while(($row = fgets($f)) != null) 
    if(mb_detect_encoding($row, 'UTF-8', true) !== false) 
     var_dump(str_getcsv($row, ';')); 
    else 
     var_dump(str_getcsv(utf8_encode($row), ';')); 

fclose($f); 

Ce qui fonctionne parce que vous lisez les caractères de deviner le codage, plutôt que de faire confiance paresseusement les 3 premiers caractères: si UTF-8 sans nomenclature serait toujours reconnu comme UTF-8. Bien sûr, si votre fichier csv n'est pas trop grand, vous pouvez faire cette détection d'encodage sur tout le contenu du fichier: quelque chose comme mb_detect_encoding(file_get_contents(...), ...)

+0

Pour excel. J'ai vérifié les fichiers avec notepad ++. Notepad ++ m'a dit qu'ils étaient encore ANSI (même s'ils étaient exportés en UTF8). Et quand j'importe des fichiers codés en UTF8 (créés avec Notepad ++) dans Excel, c'est comme si le mauvais encodage était là (j'ai des caractères spéciaux au lieu de ö, ü, ....). – Thomas

+0

@ThomasE. Peu importe, cette solution devrait fonctionner. De plus, il devrait être en mesure de faire face à l'entrée non-UTF8. Ce n'est pas si différent de celui de Baba car il applique utf8_encode aux chaînes importées à partir de vos fichiers csv problématiques. – Cimbali

0

Le problème doit être votre encodage de fichier, il semble que ce n'est pas utf-8.

Quand j'ai essayé votre exemple et double fichier vérifié est en effet utf-8, ça marche pour moi, je reçois:

Array ([0] => 1 [1] => Autriche [2 ] => Österreich)

Utilisez LibreOffice (OpenOffice), c'est plus fiable pour ce genre de choses.

1

Et pour le peuple de la République tchèque:

function convert($str) { 
    return iconv("CP1250", "UTF-8", $str); 
} 
... 
while (($data = fgetcsv($this->fhandle, 1000, ";")) !== FALSE) { 
$data = array_map("convert", $data); 
... 
Questions connexes