Deutsch nach ASCII konvertieren



Hallo!

Ich bin auf der Suche nach einem Perl-Modul bzw. vielmehr einer
Funktion, die auch durch ein Modul bereitgestellt werden darf, die
quasi wie 'encode("ascii", $string)', aber dabei deutsche Umlaute,
scharfes S etc. nach den üblichen Regeln ersetzt zu "ae", "oe", ...
"ss" etc.

Grund: Das Ziel, wo ich die Daten darstellen will, kann nur
7-Bit-Zeichen sicher transportieren bzw. verarbeiten. Und die
Ausgabe soll dabei menschenlesbar sein.


Zur Konvertierung habe ich drei Dinge gefunden:

1. Encode mit anonymer Funktion (ala perldoc Encode)

my %ascii_replace = (
196 => "Ae",
...
223 => "ss",
);

$ascii = encode(
"ascii", $string, sub {
my $c = shift;
return $ascii_replace{$c} if (defined($ascii_replace{$c}));
return "?";
}
);

Diese Variante hat den Haken, daß %ascii_replace recht umfangreich
werden könnte. Konkret will ich (deutsche) Ortsnamen umwandeln, aber
gerade in Grenznähe kommen da schon mal Akzente etc. mit hinein, die
auch berücksichtigt werden wollen.

2. Lingua::DE::ASCII

Da gibt es zwei Funktionen, to_ascii und to_latin1. Und in der
Dokumentation steht, daß sich die beiden Module quasi aufheben,
also das to_ascii offenbar einen Latin-1-kodierten String will.
Allerdings habe ich keine Lust, jedesmal meine Perl-Strings erst
nach ISO-8859-1 umzukodieren, um sie danach zu ASCII zu wandeln.

Ganz abgesehen davon: Das Modul ist wegen der Funktion to_latin1
recht komplex und fett; allerdings brauche ich die Gegenrichtung
nicht. Somit verbrate ich unnötig Platz und Ladezeit.

Allerdings muß ich wohl keinen Hash erstellen/pflegen.

3. Regex-Wirrwarr

Gefunden habe ich weiterhin eine kleine Sub, die die Ersetzung
mit einer Regex erledigt und danach gegebenenfalls verbleibende
Nicht-7-Bit-Zeichen wahlweise auch per Regex durch Fragezeichen
ersetzt oder mit tr/// wegwirft.

Ähnlich wie bei Variante 1 wird hier die Menge der Ersetzungs-Regexen
recht hoch, wenn man mehr als nur die Umlaute und das scharfe S ersetzen
will.


Alle drei Varianten haben also entscheidende Nachteile (soweit
ich das überblicke). Nun stellt sich mir die Fragen:

- Habe ich etwas übersehen?
- Gibt es das auch in "schön"?
- Wo finde ich das gegebenenfalls?
- Gibt es vielleicht ein tolles Encoding ähnlich wie ascii-ctrl,
das eine passende Ersetzung liefert?
(- Oder ist mein Problem doch so selten?)


Ach ja, fürs Protokoll: Meine Perl-Version ist 5.8.8, und
encode('MIME-Q', $string) will ich eher nicht. Auch, wenn es
vielleicht nicht die schlechteste Wahl ist.

Christoph

--
In Berlin gibt es die Pfannkuchen sowohl mit Puderzucker als auch mit
Zuckerguss. Beide Arten bekomme ich nur mit Widerwillen herunter. --
"Ein Pfannkuchen mit Puderzucker und Widerwillen, bitte..."
(Dieter Bruegmann, Volker Gringmuth)
.



Relevant Pages

  • UnicodeEncodeError in Windows
    ... def getdamage: ... """reads each line of war report ... """Build a string from a warrior's stats ... As I understand it the error is related to the ascii codec being ...
    (comp.lang.python)
  • Re: Reading LAST line from text file without iterating through the file?
    ... ASCII character values are limited to the 0-127 range. ... these days we use the 8th bit for accented characters instead ... Lines are a record format. ... way to represent an ArrayList<String> losslessly in a single String ...
    (comp.lang.java.programmer)
  • Best integer to string routines
    ... ASCII string, it can be in any format - zero-terminated, leading ... Convert byte value to ASCII hex string ... Convert byte value to ASCII decimal string ...
    (alt.lang.asm)
  • Re: Writing extended ascii characters to text file.
    ... so in order to get real ASCII codes you should use the GetBytes ... method of an Encoding instance configured for the ASCII encoding (as far as ... again, you've got bytes, not characters. ... > string line; ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: Falsches Pattern?
    ... String getXMLForm; ... Lasse Fahrzeuge defaultmäßig null oder einen irgendwie brauchbaren ... Da es eine funktionierende Variante ist, ... Im Szenario des OP scheint das durchaus ungewoehnlich und eine Ausnahme ...
    (de.comp.lang.java)