CSV-File Unicode
Stefan
- php
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
function decodeUnicode($str) {
$ret = "";
$x = strlen($str);
for ($i = 0; $i < $x; ++$i) {
if ($i % 2) {
$ret .= substr($str, $i, 1);
}
}
return $ret;
}
iconv() ?!
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"
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.
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
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?
Hi!
Was ist UNICODEBIG?
Unicode-big-endian?
off:PP
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.
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
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
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?
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
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.
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!