Frage

Ich habe einen Perl-Skript, das von Dritten aufgerufen wird mir Namen von Menschen zu schicken, die meine Software registriert hat. Eine dieser Parteien codiert die Namen in UTF-8, so habe ich mein Skript entsprechend angepasst UTF-8 in ASCII zu dekodieren mit Encode :: decode_utf8 (...).

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 habe Follow-up mit dem Kunden und fragen Sie ihn für eine „lateinischen Buchstaben Version“ seinen Namen, um einen Registrierungscode zu erteilen.

So ist es ein Perl-Modul, ob es eine solche Zeichen erkennt und automatisch übersetzt sie in ihre nächste ASCII-Darstellung, wenn nötig?

Es scheint, dass ich Lingua kann :: Kyrillisch :: Translit :: ICAO und Lingua :: DetectCharset Kyrillisch zu handhaben, aber ich würde lieber etwas, das mit anderem Charakter funktioniert auch setzt.

War es hilfreich?

Lösung

Ich glaube, Sie nutzen könnten Text :: Unidecode für dieses, es ist genau was es versucht zu tun.

Andere Tipps

Wenn Sie mit UTF-8-Daten zu tun haben, die nicht im ASCII-Bereich ist, die beste Wahl ist Ihr Back-End zu ändern, damit es nicht auf utf-8 nicht ersticken. Wie würden Sie gehen über Kanji Zeichen Transliteration?

Wenn Sie kyrillischen Text dort keine „nächste ASCII-Darstellung“ für viele Zeichen.

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

Stellen Sie sicher, dass die Eingangsdaten wirklich eine UTF-8-String ist.

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

Stellen Sie sicher, dass die Eingangsdaten wirklich eine Reihe von Zwei-Byte-Unicode-Zeichen ist.

Dies wird auch als UCS-2 bezeichnet.

Wenn Sie Strings konvertieren möchten, 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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top