[PHP] "�" Zeichen nachdem ich CSV einlese.

27o8

abgemeldet
2 Mai 2006
9.028
933
Ich habe hier ein CSV File:

partner_tracking_ppl_report.csv schrieb:
Status;Trackingcategoriename;erfasst am;bearb. am;Provision;Programme;Bemerkung;SubAffiliateName;SubAffiliateID;Werbefläche;
Offen;;05.05.2009 13:50:54;05.05.2009 13:50:55;1,00 EUR;match.com Deutschland;;;36018;cash-town.de
Offen;;04.05.2009 15:51:14;04.05.2009 15:51:16;1,00 EUR;match.com Deutschland;;;35678;cash-town.de
Offen;;25.04.2009 00:49:34;25.04.2009 00:49:37;1,00 EUR;match.com Deutschland;;;33212;cash-town.de
Offen;;10.04.2009 14:19:42;10.04.2009 14:19:45;1,00 EUR;match.com Deutschland;;;28569;cash-town.de
Transaktionen "pay per lead";
Username: ;zensiert;
Werbefläche:;Alle Werbeflächen;
von: ;01.03.2009;
bis ;31.05.2009;

Habe dazu ein Script geschrieben mit dem ich die Daten später in die Datenbank schreiben möchte, allerdings habe ich schon beim einfachen ausgeben der Zeilen Probleme, denn wenn ich das folgende Script aufrufe

PHP:
<?php
$lines = file('partner_tracking_ppl_report.csv');

for ($i=1;$i<count($lines)-5;$i++) echo $lines[$i];
?>

erhalte ich die folgende Ausgabe:

O�f�f�e�n�;�;�0�5�.�0�5�.�2�0�0�9� �1�3�:�5�0�:�5�4�;�0�5�.�0�5�.�2�0�0�9� �1�3�:�5�0�:�5�5�;�1�,�0�0� �E�U�R�;�m�a�t�c�h�.�c�o�m� �D�e�u�t�s�c�h�l�a�n�d�;�;�;�3�6�0�1�8�;�c�a�s�h�-�t�o�w�n�.�d�e� � �O�f�f�e�n�;�;�0�4�.�0�5�.�2�0�0�9� �1�5�:�5�1�:�1�4�;�0�4�.�0�5�.�2�0�0�9� �1�5�:�5�1�:�1�6�;�1�,�0�0� �E�U�R�;�m�a�t�c�h�.�c�o�m� �D�e�u�t�s�c�h�l�a�n�d�;�;�;�3�5�6�7�8�;�c�a�s�h�-�t�o�w�n�.�d�e� � �O�f�f�e�n�;�;�2�5�.�0�4�.�2�0�0�9� �0�0�:�4�9�:�3�4�;�2�5�.�0�4�.�2�0�0�9� �0�0�:�4�9�:�3�7�;�1�,�0�0� �E�U�R�;�m�a�t�c�h�.�c�o�m� �D�e�u�t�s�c�h�l�a�n�d�;�;�;�3�3�2�1�2�;�c�a�s�h�-�t�o�w�n�.�d�e� � �O�f�f�e�n�;�;�1�0�.�0�4�.�2�0�0�9� �1�4�:�1�9�:�4�2�;�1�0�.�0�4�.�2�0�0�9� �1�4�:�1�9�:�4�5�;�1�,�0�0� �E�U�R�;�m�a�t�c�h�.�c�o�m� �D�e�u�t�s�c�h�l�a�n�d�;�;�;�2�8�5�6�9�;�c�a�s�h�-�t�o�w�n�.�d�e� � �T�r�a�n�s�a�k�t�i�o�n�e�n� �"�p�a�y� �p�e�r� �l�e�a�d�"�;� �U�s�e�r�n�a�m�e�:� �;�s�u�p�p�o�r�t�@�c�a�s�h�-�t�o�w�n�.�d�e�;� �W�e�r�b�e�f�l�?�h�e�:�;�A�l�l�e� �W�e�r�b�e�f�l�?�h�e�n�;�

Was ist da los? :ugly:
 
Sieht nach 'nem Zeichensatzproblem aus. Welchen Zeichensatz hat denn die CSV-Datei und welchen Deine Seite?
 
Also die Seite hat ISO-8859-1 und beim CSV File seh ich das nun irgendwie nicht :oops:
 
Probier mal folgendes:
PHP:
<?php
  // Im Stück einlesen, um das Encoding effizient bearbeiten zu können
  $content = file_get_contents('partner_tracking_ppl_report.csv');

  // Zu ISO-8859-1 konvertieren
  $content = mb_convert_encoding($content, 'iso-8859-1');

  // Content wieder zerlegen, damit's ist wie vorher
  $lines = explode("\n", $content);

  // Ab hier alles wie vorher ;)
  for ($i=1;$i<count($lines)-5;$i++) echo $lines[$i];
?>
 
Ich vermute, dass die CSV Datei in einem 16-Bit Format vorliegt.

Falls du Windows verwendest kannst du ja folgendes versuchen:

Öffnen die CSV Datei mit Notepad
Dann gehe auf "Speichern unter.."
Dort kannst du das Encoding einstellen. Nimm "ANSI".

Wenn meine Vermutung stimmt, dann müßte die neue Datei nun ca halb so groß sein.
 
Versuch doch mal, an der schon genannten "mb_convert_encoding"-Funktion den dritten Parameter, die "Quell-Kodierung", anzuhängen. Sicherlich hat die Funktion die Kodierung nicht von alleine erkannt.

Ich würde zuerst mb_convert_encoding($content, 'iso-8859-1', 'utf-16'); versuchen. Wenn das nicht klappt, probier weiter mit 'utf-16be', 'utf-16le', 'ucs2' und was alles noch naheliegend klingt (in der php Doc stehen hoffentlich irgendwo die möglichen Kodierungen drin).

Natürlich kann man der mb...-Bibliothek (beschränkt) direkt mit den fremdkodierten Daten arbeiten (sofern du die passende Kodierung gefunden hast), nur müsstest du dann konsequent drauf achten, das du möglichst die mb-Funktionen verwendest. Das heißt "mb_substr" statt "substr", "mb_strlen" statt "strlen" usw.. Wenn du das Zeug nachher ausgeben willst, achte drauf, den Content-Type korrekt zu setzen oder sie gegebenfalls ins richtige Format zu überführen. Ich weiß, ist etwas tricky. Echtes natives Unicode wird soweit ich weiß erst ab PHP 6 unterstützt.