Meise2000: Von Unicode nach iso-8859-1

Hallo,

ich habe ein Problem: Ich verwende den XML-Parser von Perl, der intern alle Zeichen als Unicode auswertet. Da es Darstellungsprobleme gibt, muss ich alle Strings in das iso-8859-1 Format verwandeln. Unter:

http://www.xml.com/pub/a/2000/04/26/encodings/index.html?page=2

wird beschrieben, dass man das ganz easy mit dem Befehl:

$string =~ tr/\0-\xff//UC;

machen kann. Lokal funktioniert auch alles einwandfrei. Jedoch klappt das auf den Servern meines Providers nicht. Ich bekomme immer einen 500er Error. Nehme ich die Optionsparameter (UC) weg, so klappt alles bestens... Habt ihr eine Ahnung, woran das liegen kann? Muss dafür ein bestimmtes Modul installiert sein?

Danke,
Meise2000

  1. Halihallo Meise2000

    machen kann. Lokal funktioniert auch alles einwandfrei. Jedoch klappt das auf den Servern meines Providers nicht. Ich bekomme immer einen 500er Error. Nehme ich die Optionsparameter (UC) weg, so klappt alles bestens... Habt ihr eine Ahnung, woran das liegen kann? Muss dafür ein bestimmtes Modul installiert sein?

    Nein, aber Perl 5.8.x, Du scheinst noch 5.6 auf dem Server laufen zu haben, dieses hat
    noch keine Unicode Unterstützung (IMHO).
    Lies mal:

    perldoc perluniintro
    perldoc perlunicode

    Bei perluniintro stehen unten "UNICODE IN OLDER PERLS", vielleicht hilft Dir dies weiter?

    Viele Grüsse

    Philipp

    --
    RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
    Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
    1. Hi!

      Wer einfach nur mal schnell UTF-8 in Latin-1 konvertieren moechte, ohne die neueste Perl-Version oder diverse Module installieren zu muessen, findet folgenden Code vielleicht hilfreich. Voraussetzung fuer das korrekte Funktionieren ist, dass es sich beim Input wirklich um einen UTF-8-String handelt, der vollstaendig in Latin-1 darstellbar ist.

      sub utf8_to_latin1($) {
          my ($i, @s);

      @s = unpack('C*', $_[0]);
          for ($i=0; $i<@s; $i++) {
              splice(@s, $i, 2, (($s[$i] & 0x03) << 6) | ($s[$i+1] & 0x3F))
                  if (($s[$i] & 0xFC) == 0xC0);
          }
          return pack('C*', @s);
      }

      Das ganze zum Nachvollziehen noch mal in ausfuehrlich:

      sub utf8_to_latin1($) {
          my ($i, @s);

      @s = unpack('C*', $_[0]);

      $i = 0;
          while ($i < @s) {
              if ($s[$i] & 0x80) {
                  # is a UTF-8 code
                  if (($s[$i] & 0xFC) == 0xC0) {
                      # this will render a valid Latin1 char
                      $s[$i] = (($s[$i] & 0x03) << 6) | ($s[$i+1] & 0x3F);
                      splice(@s, $i+1, 1);
                      $i++;
                  } else {
                      # any other unicode char
                      # we could determine the number of bytes of this code and skip them, but as the following
                      # values all have bit 7 set and bit 6 unset in a valid utf8 stream, we can just skip over
                      # this byte and the following will be automatically skipped as well. ok, we've seen more
                      # performant approaches, but this case is not expected to happen at all. after all, the
                      # string should be encodable in iso-8859-1

      $i++;
                  }

      } else {
                  # ASCII - leave unchanged
                  $i++;
              }
          }

      return pack('C*', @s);
      }

      HTH && So long

      --
      I'm sorry. It has to end here.
    2. Halihallo

      Nein, aber Perl 5.8.x, Du scheinst noch 5.6 auf dem Server laufen zu haben, dieses hat
      noch keine Unicode Unterstützung (IMHO).

      Ich glaube ich irrte?

      <cite>
      The use of the Unicode::String module is deprecated in Perl 5.6, as there is a simpler way to perform the same operation:

      $string =~ tr/\0-\xff//UC;
      </cite>

      heisst für mich, dass es >5.6 funktionieren sollte... Hast du auf dem Server eine
      Perl-Version < 5.6 installiert?

      Ich habe das Dokument erst jetzt gelesen, sorry. Aber Calocybe weiss ja Rat, wenn's mit
      UC nicht funktioniert :-)

      Viele Grüsse

      Philipp

      --
      RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
      Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.