2009-03-12 15 views
7

Ich habe ein Perl-Skript, das von Dritten aufgerufen wird, um mir Namen von Personen zu senden, die meine Software registriert haben. Einer dieser Teilnehmer kodiert die Namen in UTF-8, daher habe ich mein Skript entsprechend angepasst, um UTF-8 mit Encode :: decode_utf8 (...) in ASCII zu dekodieren.Wie kann ich Nicht-ASCII-Zeichen, die in UTF8 codiert sind, in Perl in ASCII-äquivalent konvertieren?

Dies funktioniert in der Regel gut, aber alle 6 Monate oder so einen der Namen enthält kyrillische, griechische oder rumänisch Zeichen, so die Namen Decodierung Ergebnisse in sinnlose Zeichen wie „ПоÐ'Ñ € Ð ° жР° нÑкР° "". Ich muss mit dem Kunden nachfragen und ihn nach einer "lateinischen Charakterversion" seines Namens fragen, um einen Registrierungscode auszugeben.

Gibt es also ein Perl-Modul, das erkennen kann, ob solche Zeichen vorhanden sind, und diese bei Bedarf automatisch in ihre nächste ASCII-Darstellung übersetzt?

Es scheint, dass ich Lingua :: Cyrillic :: Translit :: ICAO plus Lingua :: DetectCharset verwenden kann, um mit Kyrillisch umzugehen, aber ich würde etwas bevorzugen, das auch mit anderen Zeichensätzen funktioniert.

Antwort

12

Ich glaube, Sie könnten Text::Unidecode dafür verwenden, es ist genau das, was es zu tun versucht.

+0

Genau das, was ich gesucht habe - Danke! :-) –

0

Wenn Sie mit UTF-8-Daten umgehen müssen, die nicht im ASCII-Bereich liegen, sollten Sie Ihr Backend so ändern, dass es nicht an utf-8 erstickt. Wie würdest du die transkribierenden Kanji-Zeichen übersetzen?

+0

Innerhalb mehr als 10 Jahren von Shareware-Entwicklung, ich nur eine Handvoll Kunden aus Japan und China hatte. Unicode-Aktivierung aller meiner Shareware-Programme, nur um eine leichte Belästigung zu kümmern, wäre übertrieben. Ich suche in diesem Fall mehr nach einem schnellen und schmutzigen Ansatz. –

+0

Also vielleicht (nur vielleicht), könnten Sie viel mehr Kunden finden, wenn Sie utf-8 aktiviert haben? – innaM

+0

Ein paar: ja. Viel und die Zeit der Entwicklung wert: Nein. Piraterie ist ein sehr großes Thema im Shareware-Geschäft, besonders in Ländern wie China. Der japanische Markt ist nicht schlecht, aber von dem, was ich von anderen Shareware-Autoren gehört habe, ist es normalerweise nicht wert, es sei denn, du hast einen wirklich großen Titel. –

0

Wenn Sie cyrilic Text erhalten, gibt es keine "nächste ASCII-Darstellung" für viele Zeichen.

+0

+1. Transliteration ist keine einfache Aufgabe, einzelne Zeichen zu ersetzen. Entweder Unicode richtig unterstützen oder nur ASCII unterstützen; alles dazwischen wird schnell unordentlich. – bobince

+0

Nichtsdestotrotz kann ich, wenn ich jemanden aus Russland nach seinem Namen frage, eine lateinische Charakterversion davon liefern. Ich bin mir bewusst, dass einige Zeichen nur grobe Annäherungen sind, aber offensichtlich muss es eine Lösung für mein Problem geben. –

+0

Nun, einige Namen, die sie Ihnen als lateinische Entsprechungen geben, sind nicht ihre "echten" Namen. –

0

In der Dokumentation für Text :: Unicode unter „Caveats“, scheint es, dass dieser Satz falsch ist:

Vergewissern Sie sich, dass die Eingangsdaten wirklich ein UTF-8-String ist.

UTF-8 ist eine Codierung mit variabler Länge, während Text :: Unidecode nur eine Codierung mit fester Länge (zwei Byte) für jedes Zeichen akzeptiert. So sollte dieser Satz lesen:

Stellen Sie sicher, dass die Eingabedaten wirklich eine Zeichenfolge aus zwei Byte Unicode-Zeichen ist.

Dies wird auch als UCS-2 bezeichnet.

Wenn Sie Zeichenfolgen konvertieren, die wirklich utf8 sind, würden Sie es wie so tun:

my $decode_status = utf8::decode($input_to_be_converted); 
my $converted_string = unidecode ($input_to_be_converted); 
Verwandte Themen