Stefan: CSV-File Unicode

Hallo zusammen,

ich würde gerne ein Unicode CSV-File verarbeiten.
So weit so gut.

irgendwie komme ich aber auf keinen "grünen Zweig"....

zuerst habe ich es so versucht:

  
function decodeUnicode($str) {  
	$ret = "";  
	$x = strlen($str);  
	for ($i = 0; $i < $x; ++$i) {  
		if ($i % 2) {  
			$ret .= substr($str, $i, 1);  
		}  
	}  
	return $ret;  
}  
  
$fh = fopen($CSVFilename,"r");  
while($line=fgetcsv($fh,null,"\t","\"")){  
	$CSVData = array();  
	$i = 0;  
	foreach ($line as $data){  
		$data = trim(decodeUnicode($data));  
		$data = trim(preg_replace("/^\"(.*)\"$/", "\\1", $data));  
		$CSVData[$i] = $data ;  
		$i ++;  
	}  
	print_r($CSVData);  
}  

Die Ausgabe ist ok, nur leider werden hier anscheinend manche " übergangen, bzw statt der eigtl 4 Spalten erhalte ich teilweise 5....

evtl jemand hier, der meinen Fehler sieht?

Danke im Voraus!

mit

  
$data = file_get_contents($CSVFilename,"r");  
$data = iconv("UNICODEBIG", "ASCII",$data);  

erhalte ich immer "Detected an illegal character in input string in"

Das komische: mein OpenOffice zeigt das File korrekt an :s

  1. function decodeUnicode($str) {
    $ret = "";
    $x = strlen($str);
    for ($i = 0; $i < $x; ++$i) {
    if ($i % 2) {
    $ret .= substr($str, $i, 1);
    }
    }
    return $ret;
    }

    iconv() ?!

    1. function decodeUnicode($str) {
      $ret = "";
      $x = strlen($str);
      for ($i = 0; $i < $x; ++$i) {
      if ($i % 2) {
      $ret .= substr($str, $i, 1);
      }
      }
      return $ret;
      }

      iconv() ?!

      siehe letztes Post ganz unten ;-)

        
      $data = file_get_contents($CSVFilename,"r");  
      $data = iconv("UNICODEBIG", "ASCII",$data);  
      
      

      erhalte ich immer "Detected an illegal character in input string in"

      1. siehe letztes Post ganz unten ;-)

        Pardon, überlesen :D

        $data = file_get_contents($CSVFilename,"r");
        $data = iconv("UNICODEBIG", "ASCII",$data);

          
        Was ist UNICODEBIG? Die üblichen Zeichencodierungen für Unicode-Files sind UTF-8, UTF-16BE, UTF-16LE.  
          
        Welche Charsets iconv unterstützt, liegt an der Implementierung im System - UNICODEBIG ist mir aber eben überhaupt nicht geläufig.
        
        1. Hallo,

          $data = file_get_contents($CSVFilename,"r");
          $data = iconv("UNICODEBIG", "ASCII",$data);

          
          >   
          > Was ist UNICODEBIG? Die üblichen Zeichencodierungen für Unicode-Files sind UTF-8, UTF-16BE, UTF-16LE.  
            
          ich vermute, dass hier die Zeichencodierung vorliegt, die Microsoft als Unicode bezeichnet, [UCS-2](http://de.wikipedia.org/wiki/UCS-2).  
            
            
          Freundliche Grüße  
            
          Vinzenz
          
          1. Hallo,

            $data = file_get_contents($CSVFilename,"r");
            $data = iconv("UNICODEBIG", "ASCII",$data);

            
            > >   
            > > Was ist UNICODEBIG? Die üblichen Zeichencodierungen für Unicode-Files sind UTF-8, UTF-16BE, UTF-16LE.  
            >   
            > ich vermute, dass hier die Zeichencodierung vorliegt, die Microsoft als Unicode bezeichnet, [UCS-2](http://de.wikipedia.org/wiki/UCS-2).  
            >   
            >   
            > Freundliche Grüße  
            >   
            > Vinzenz  
              
            Vielen Dank, hiermit funktioniert es zumindest am PC unter Zend :s  
              
            auf meinem Debian erhalt ich wieder den Fehler "Notice: iconv(): Detected an illegal character in input string"  
            mit //TRANSLIT erhalte ich ganz wilde "?" am Ende und mit //Ignore bricht er einfach ohne Fehlermeldung nach 93 Zeilen ab :s  
              
            ~~~php
              
            if (!isset($CSVFilename)){  
            	$CSVFilename = dirname(__FILE__) . "/../../tmp/robbe/" . "Zubehoer.csv";  
            }  
            $data = file_get_contents($CSVFilename,"r");  
            $data = iconv("UCS-2", "ISO-8859-1//IGNORE", $data);  
              
            $fh = fopen ($CSVFilename ."_iso","w+");  
            fwrite($fh, $data);  
            unset($data);  
            rewind($fh);  
              
              
            while($line=fgetcsv($fh,null,"\t","\"")){  
            .....  
            }  
            
            

            hat evtl noch jemand einen Tipp?

        2. Hi!

          Was ist UNICODEBIG?

          Unicode-big-endian?

          off:PP

          --
          "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
          1. Unicode-big-endian?

            Unicode ist ein Zeichensatz, keine Zeichencodierung - Unicode ist big- oder little-endian einerlei.

            UTF hingegen kann schon etwas damit anfangen, darum hätte ich auf UTF-16BE getippt.

            1. Hi!

              Unicode-big-endian?
              Unicode ist ein Zeichensatz, keine Zeichencodierung - Unicode ist big- oder little-endian einerlei.

              UTF hingegen kann schon etwas damit anfangen, darum hätte ich auf UTF-16BE getippt.

              Und wofür steht das "BE"?

              off:PP

              --
              "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
              1. Hi!

                Unicode-big-endian?
                Unicode ist ein Zeichensatz, keine Zeichencodierung - Unicode ist big- oder little-endian einerlei.

                UTF hingegen kann schon etwas damit anfangen, darum hätte ich auf UTF-16BE getippt.

                Und wofür steht das "BE"?

                Schon gut: ich hätte _erst_ richtig lesen sollen - mea culpa!

                off:PP

                --
                "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
                1. Und wofür steht das "BE"?

                  Schon gut: ich hätte _erst_ richtig lesen sollen - mea culpa!

                  Was hast du denn gelesen, wenn ich fragen darf?

                  1. Hi!

                    Und wofür steht das "BE"?

                    Schon gut: ich hätte _erst_ richtig lesen sollen - mea culpa!

                    Was hast du denn gelesen, wenn ich fragen darf?

                    Ich habe nach dem 'U' am Wortanfang nicht weitergelesen.

                    off:PP

                    --
                    "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
      2. Hi!

        erhalte ich immer "Detected an illegal character in input string in"

        Was passiert wenn man //TRANSLIT oder //IGNORE weglaesst und Sonderzeichen vorkommen.

        In der Doku ist ein Beispiel.

        --
        "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
              - T. Pratchett
  2. Hi!

    ich würde gerne ein Unicode CSV-File verarbeiten.

    Unicode ist ein Zeichensatz, keine Zeichenkodierung. Zum physikalischen Abbilden von Daten wird eine Zeichenkodierung benötigt. In welcher Kodierung liegt die Datei wirklich vor?

    function decodeUnicode($str) {

    $ret = "";
    $x = strlen($str);
    for ($i = 1; $i < $x; $i += 2)
    $ret .= substr($str, $i, 1);
    return $ret;
    }

      
    Danach (von mir ein bisschen gekürzt) zu urteilen liegt wohl UTF-16BE vor. Du nimmst immer nur das zweite Byte und bekommst von Zeichen jenseits vom Codepoint 255 kaputtes Zeug. Aber egal erst einmal, vielleicht hast du ja solche Zeichen nicht.  
      
    
    > $fh = fopen($CSVFilename,"r");  
    > while($line=fgetcsv($fh,null,"\t","\"")){  
      
    Ich könnte nun eine Weile spekulieren über die Mischung von UTF-16BE und einer 1-Byte-Kodierung für die Trennzeichen, aber besser wäre, wenn du mal einen Hex-Dump zeigst, in dem mindestens eine komplette Zeile und ein " als Datenbestandteil vorkommt.  
      
    
    > evtl jemand hier, der meinen Fehler sieht?  
      
    Sicherlich nicht ohne die Ausgangsdaten zu kennen.  
      
      
    Lo!