Blackbit: kästchen in dem 0095 steht zu etwas brauchbarem umwandeln

Guten Tag,

ich hab habe das problem das ich gerne das hier kästchen in dem 0095 steht 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 :(

  1. Tach!

    ich hab habe das problem das ich gerne das hier kästchen in dem 0095 steht 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.

    1. Tach!

      ich hab habe das problem das ich gerne das hier kästchen in dem 0095 steht 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

      1. 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.

        1. 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

      2. 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.

        1. 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..

          1. 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.

            1. 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:

              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);
              
              1. 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.

              2. 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;  
                }  
                
                
                1. 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
                  
  2. 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

    1. 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...
      
      1. 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

        --
        Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.