kästchen in dem 0095 steht zu etwas brauchbarem umwandeln
Blackbit
- perl
Guten Tag,
ich hab habe das problem das ich gerne das hier mit perl zu einen <br> oder so umwandeln möchte
denn aus irgendeinem grund kann kein program das symbol was eigendlich ein bullet zeichen ist richtig anzeigen... wohl ein codierungsproblem :(
Tach!
ich hab habe das problem das ich gerne das hier
mit perl zu einen <br> oder so umwandeln möchte
denn aus irgendeinem grund kann kein program das symbol was eigendlich ein bullet zeichen ist richtig anzeigen... wohl ein codierungsproblem :(
Das ist nur dann ein Bullet-Zeichen, wenn du Windows-1252 verwendest. Anscheinend hast du aber von ISO-8859-1 nach UTF-8 umkodiert und da ist der Wert 0x95 nicht (als Bullet) definiert. Der Umkodiermechanismus hat daraufhin die 0x95 in das entsprechende UTF-8-Pendant umkodiert, was weiterhin ein nicht definiertes Zeichen ergibt. Deswegen siehst du die Ersatzdarstellung.
Du must also erstmal dein Zeichenkodierungsproblem dahingehend lösen, dass du nur die definierten Zeichen verwendest oder aber die korrekte Angabe zur Zeichenkodierung - am besten beides zusammen.
dedlfix.
Tach!
ich hab habe das problem das ich gerne das hier
mit perl zu einen <br> oder so umwandeln möchte
denn aus irgendeinem grund kann kein program das symbol was eigendlich ein bullet zeichen ist richtig anzeigen... wohl ein codierungsproblem :(Das ist nur dann ein Bullet-Zeichen, wenn du Windows-1252 verwendest. Anscheinend hast du aber von ISO-8859-1 nach UTF-8 umkodiert und da ist der Wert 0x95 nicht (als Bullet) definiert. Der Umkodiermechanismus hat daraufhin die 0x95 in das entsprechende UTF-8-Pendant umkodiert, was weiterhin ein nicht definiertes Zeichen ergibt. Deswegen siehst du die Ersatzdarstellung.
Du must also erstmal dein Zeichenkodierungsproblem dahingehend lösen, dass du nur die definierten Zeichen verwendest oder aber die korrekte Angabe zur Zeichenkodierung - am besten beides zusammen.
dedlfix.
naja auf die quelldatei mit den bullet dingern hab ich keinen einfluss die wird von anderen erstellt... ich möchte die textdatei eigendich nur in ganz normalen unicode haben deswegen such ich ne möglichkeit die unicodes durch irgendwas anderes auszutauschen wie zb ein <br> tag
so ähnlich zb: $variable =~ s/bullet/<br>/g;
für die bullet zeichen hab ich sowieso keine verwendung
Tach!
naja auf die quelldatei mit den bullet dingern hab ich keinen einfluss die wird von anderen erstellt...
In welcher Kodierung wird sie erstellt?
ich möchte die textdatei eigendich nur in ganz normalen unicode haben
Ganz normales Unicode ist nie in Dateien enthalten. In Dateien befinden sich die Unicode-Zeichen immer in irgendeinem Unicode Transformation Format (UTF-8, UTF-16, ...). Wenn du die Datei bereits UTF-irgendwas-kodiert bekommst und sich darin die entsprechende Bytesequenz für das Zeichen U+0095 befindet, so ist das kein Bullet sondern ein Steuerzeichen. Dann hat jemand einen Fehler gemacht. Wenn du sie umkodiert hast, liegt der Fehler auf deiner Seite. Hast du Windows-1252-spezifische Zeichen in deinem Dokument (wovon man ausgehen muss, wenn 0x95 ein Bullet ist), dann musst du das von da aus nach UTF-irgendwas umkodieren, damit die Bytesequenz für den korrekten Unicode-Codepoint U+2022 entsteht.
deswegen such ich ne möglichkeit die unicodes durch irgendwas anderes auszutauschen wie zb ein <br> tag
Was hast du wirklich in der Datei stehen? Schau da bitte mit einem Hex-Editor nach. Wenn sie UTF-8-kodiert sein soll und du für das Bullet ein C2 95 findest, dann ist das kein Bullet (U+2022, UTF8: E2 80 A2) sondern das Steuerzeichen U+0095. Wenn du auf Zeichenebene arbeitest, musst du dieses Steuerzeichen ersetzen und im Code dieses Zeichen oder eine Escape-Sequenz davon notieren. Auf Byte-Ebene gearbeitet musst du die eben die Sequenz C2 95 bearbeiten.
Ich kann dir nur sagen, wie du es theoretisch machen musst, weil ich einerseits aus deiner Beschreibung nicht konkret entnehmen kann, was wirklich vorliegt und dir andererseits auch nicht sagen kann, wie das in Perl zu handhaben ist.
dedlfix.
Tach!
naja auf die quelldatei mit den bullet dingern hab ich keinen einfluss die wird von anderen erstellt...
In welcher Kodierung wird sie erstellt?
ich möchte die textdatei eigendich nur in ganz normalen unicode haben
Ganz normales Unicode ist nie in Dateien enthalten. In Dateien befinden sich die Unicode-Zeichen immer in irgendeinem Unicode Transformation Format (UTF-8, UTF-16, ...). Wenn du die Datei bereits UTF-irgendwas-kodiert bekommst und sich darin die entsprechende Bytesequenz für das Zeichen U+0095 befindet, so ist das kein Bullet sondern ein Steuerzeichen. Dann hat jemand einen Fehler gemacht. Wenn du sie umkodiert hast, liegt der Fehler auf deiner Seite. Hast du Windows-1252-spezifische Zeichen in deinem Dokument (wovon man ausgehen muss, wenn 0x95 ein Bullet ist), dann musst du das von da aus nach UTF-irgendwas umkodieren, damit die Bytesequenz für den korrekten Unicode-Codepoint U+2022 entsteht.
deswegen such ich ne möglichkeit die unicodes durch irgendwas anderes auszutauschen wie zb ein <br> tag
Was hast du wirklich in der Datei stehen? Schau da bitte mit einem Hex-Editor nach. Wenn sie UTF-8-kodiert sein soll und du für das Bullet ein C2 95 findest, dann ist das kein Bullet (U+2022, UTF8: E2 80 A2) sondern das Steuerzeichen U+0095. Wenn du auf Zeichenebene arbeitest, musst du dieses Steuerzeichen ersetzen und im Code dieses Zeichen oder eine Escape-Sequenz davon notieren. Auf Byte-Ebene gearbeitet musst du die eben die Sequenz C2 95 bearbeiten.
Ich kann dir nur sagen, wie du es theoretisch machen musst, weil ich einerseits aus deiner Beschreibung nicht konkret entnehmen kann, was wirklich vorliegt und dir andererseits auch nicht sagen kann, wie das in Perl zu handhaben ist.
dedlfix.
jop im hex editor zeigt er mir C2 95 0A an für das bullet.. jetzt muss ich nur noch rausbekommen wie ich die ersetzen kann
Angenommen, in $variable befindet sich der Text, den du als Bytes eingelesen hast:
use charnames qw(:full);
use Encode qw(decode);
my $html = decode 'Windows-1252', $variable;
$html =~ s/\N{BULLET}/<br>/g;
Zur Erklärung lies http://p3rl.org/UNI.
Angenommen, in $variable befindet sich der Text, den du als Bytes eingelesen hast:
use charnames qw(:full);
use Encode qw(decode);
my $html = decode 'Windows-1252', $variable;
$html =~ s/\N{BULLET}/<br>/g;Zur Erklärung lies http://p3rl.org/UNI.
das funktioniert zwar ich hatte auch schon auf anderem wege das gleiche versucht mit dem gleichen ergebnis wie jetzt unzwar steht da nun Â<br> und sämtliche umlaute sind nur noch schrott..
Sorry, diese Beschreibung ist nicht ausreichend. Bitte lade die Eingabedatei irgendwo hoch, so dass wir sie auch analysieren können. Du hast bereits einen Hexeditor erwähnt; ein zusätzlicher Hexdump von der Datei hier als Text gepostet wäre auch nicht schlecht. Zeige deinen Perlcode.
Sorry, diese Beschreibung ist nicht ausreichend. Bitte lade die Eingabedatei irgendwo hoch, so dass wir sie auch analysieren können. Du hast bereits einen Hexeditor erwähnt; ein zusätzlicher Hexdump von der Datei hier als Text gepostet wäre auch nicht schlecht. Zeige deinen Perlcode.
alles klar also erstma wenn ich das zeichen einzeln in einer textdatei speicher ergibt das in hexadezimal C2 95 0A da entspricht dann ja das C2 95 dem steuerzeichen und das 0A keine ahnung
hier dann einma die problem quelldatei:
und hier mein perl code:
#!/usr/bin/perl -w
use strict;
use warnings;
use utf8;
open (PREISLISTE, "</home/lxuser/Desktop/firma/dist_to_exa/quell.txt");
my @preisliste = <PREISLISTE>;
close (PREISLISTE);
foreach (@preisliste) {
$_ =~ s/\N{U+0095}/<br>/g;
}
open (PREISLISTE_NEU, ">>/home/lxuser/Desktop/firma/dist_to_exa/anticode_out.txt");
print PREISLISTE_NEU "@preisliste\n";
close (PREISLISTE_NEU);
Tach!
alles klar also erstma wenn ich das zeichen einzeln in einer textdatei speicher ergibt das in hexadezimal C2 95 0A da entspricht dann ja das C2 95 dem steuerzeichen und das 0A keine ahnung
Danke, mit den genauen Werten können wir nun mehr als nur Vermutungen anstellen.
Das 0A ist ein LF (LineFeed). Das C2 95 ist wie gesagt kein Bullet sondern das Steuerzeichen U+0095. Wenn du das als Bullet eingibst und dein Editor speichert das als C295, dann ist der eindeutig defekt. Er übersetzt offensichtlich 1:1 das Windows-1252 nach Unicode U+0000..U+00FF, was falsch ist, weil die Windows-1252-Zeichen zwischen 0x80 und x09F an anderer Stelle in Unicode angesiedelt sind. Windows-1252 ist eben kein ISO-8859-1.
Jedenfalls, wenn du mit Zeichen arbeitest, musst du dieses Steuerzeichen ersetzen.
hier dann einma die problem quelldatei:
Quelldatei
Die ist bis auf die falschen Bullets soweit UTF-8.
und hier mein perl code:
Du erzeugst ja eine Ausgabedatei. Wenn ich mir diese anschaue, dann sehe ich sinngemäß: ...ures:C2<br> Konverter...
Das heißt, dass das 95 übersetzt, der Rest jedoch ignoriert wurde. Das Script liest also wohl nicht die Quelldatei als UTF-8 ein.
Nächster Versuch, Ausgabedatei löschen und perl mit -C aufrufen (das Internet hat mir verraten, dass dann die Eingaben als UTF-8 interpretiert werden). Ergebnis ist bei mir: ...ures:<br> Konverter... und auch die Umlaute sind immer noch gültiges UTF-8.
dedlfix.
das 0A keine ahnung
――――
Wenn's dir nur darum geht, diesen einen Fehler in deiner Quelldatei zu verbessern, benutze Perl von der Kommandozeile als Streameditor. Zur Erklärung der Schalter siehe perldoc perlrun.
perl -i.bak -C -0777 -Mcharnames=full -ple's/\x95/\N{BULLET}/g' 0095.txt
Das ganze noch einmal etwas ausführlicher als Programmdatei:
use strict;
use warnings FATAL => 'all';
use charnames qw(:full);
use autodie;
my $preisliste;
{
open my $p_handle, '<:encoding(UTF-8)', '/home/lxuser/Desktop/firma/dist_to_exa/quell.txt';
local $/;
$preisliste = readline $p_handle;
close $p_handle;
}
$preisliste =~ s/\x95/"\N{BULLET}"/g;
{
open my $p_handle, '>:encoding(UTF-8)', '/home/lxuser/Desktop/firma/dist_to_exa/anticode_out.txt';
print {$p_handle} $preisliste;
close $p_handle;
}
das 0A keine ahnung
Zeilenvorschub――――
Wenn's dir nur darum geht, diesen einen Fehler in deiner Quelldatei zu verbessern, benutze Perl von der Kommandozeile als Streameditor. Zur Erklärung der Schalter siehe perldoc perlrun.
perl -i.bak -C -0777 -Mcharnames=full -ple's/\x95/\N{BULLET}/g' 0095.txt
Das ganze noch einmal etwas ausführlicher als Programmdatei:
use strict;
use warnings FATAL => 'all';
use charnames qw(:full);
use autodie;my $preisliste;
{
open my $p_handle, '<:encoding(UTF-8)', '/home/lxuser/Desktop/firma/dist_to_exa/quell.txt';
local $/;
$preisliste = readline $p_handle;
close $p_handle;
}$preisliste =~ s/\x95/"\N{BULLET}"/g;
{
open my $p_handle, '>:encoding(UTF-8)', '/home/lxuser/Desktop/firma/dist_to_exa/anticode_out.txt';
print {$p_handle} $preisliste;
close $p_handle;
}
jau so funktioniert das wunderbar :)
vielen dank
hi,
hast Du die Bytes? Wenn ja, kannst Du die umwandeln:
# hast Du Bytes (hier utf-8-bytes aus dem Codepoint erzeugt):
my $bytes = pack "U", 0x95;
# Bytes umwandeln
use bytes;
$bytes =~ s/$bytes/<br>/;
print "$bytes \n"; # <br>
# erzeuge mal die ISO-Bytes aus dem gleichen Codepoint 0x95
$bytes = pack "C", 0x95;
$bytes =~ s/$bytes/<br>/;
print "$bytes \n"; # <br>
Hotti
hi,
hast Du die Bytes? Wenn ja, kannst Du die umwandeln:
hast Du Bytes (hier utf-8-bytes aus dem Codepoint erzeugt):
my $bytes = pack "U", 0x95;
Bytes umwandeln
use bytes;
$bytes =~ s/$bytes/<br>/;
print "$bytes \n"; # <br>erzeuge mal die ISO-Bytes aus dem gleichen Codepoint 0x95
$bytes = pack "C", 0x95;
$bytes =~ s/$bytes/<br>/;
print "$bytes \n"; # <br>
>
> Hotti
nein ich habe die bytes nicht und ich weiß auch nicht wie ich daran komme...
hi,
nein ich habe die bytes nicht und ich weiß auch nicht wie ich daran komme...
Ja, wenn Du da nichts hast, kannst Du auch nichts umwandeln. Btw., hinter dem Codepoint U+0095 steckt kein Zeichen sondern eine Kontrollsequenz. So sagt es das Unicode-Konsortium.
Die Bullets als Zeichen haben höhere Codepoints, siehe
Suchergebnis
Hotti