2009-03-12 15 views
7

Mam skrypt Perla, który jest wywoływany przez osoby trzecie, aby wysłać mi nazwiska osób, które zarejestrowały moje oprogramowanie. Jedna z tych stron koduje nazwy w UTF-8, więc odpowiednio dostosowałem mój skrypt, aby odszyfrować kodowanie UTF-8 do ASCII za pomocą Encode :: decode_utf8 (...).Jak przekonwertować znaki spoza ASCII zakodowane w UTF8 na równoważnik ASCII w Perlu?

Zwykle działa dobrze, ale co 6 miesięcy jedna z nazw zawiera znaki cyrylicy, greki lub rumuńskie, więc dekodowanie nazwy powoduje powstawanie znaków śmieci, takich jak "ПоÐ'Ñ € Ð ° жР° нÑкР° Ñ ​​". Muszę skontaktować się z klientem i poprosić go o "łacińską wersję postaci" jego nazwiska w celu wydania kodu rejestracyjnego.

Więc jest jakiś moduł Perl, które mogą wykryć, czy istnieją takie znaki i automatycznie przekłada je do najbliższego ASCII w razie potrzeby?

Wygląda na to, że mogę używać Lingua :: Cyrillic :: Translit :: ICAO plus Lingua :: DetectCharset do obsługi cyrylicy, ale wolę coś, co działa również z innymi zestawami znaków.

Odpowiedz

12

wierzę można użyć Text::Unidecode dla tego, to właśnie to, co próbuje zrobić.

+0

Właśnie tego szukałem - dzięki! :-) –

0

Jeśli masz do czynienia z UTF-8 danych, które nie mieszczą się w zakresie ASCII, najlepiej jest zmienić backend więc nie dusić na UTF-8. Jak byś posunął się do transliteracji znaków kanji?

+0

W ciągu ponad 10 lat rozwoju shareware, miałem tylko garść klientów z Japonii i Chin. Unicode - włączenie wszystkich moich programów typu shareware tylko po to, by zadbać o łagodną irytację byłoby przesadzone. W tym przypadku bardziej szukam szybkiego i brudnego podejścia. –

+0

Więc może (tylko może), możesz znaleźć dużo więcej klientów, jeśli włączysz utf-8? – innaM

+0

Kilka: tak. Wiele i warte czasu rozwoju: Nie. Piractwo jest bardzo dużym problemem w branży shareware, szczególnie w krajach takich jak Chiny. Japoński rynek nie jest zły, ale z tego, co słyszałem od innych twórców shareware, zazwyczaj nie jest to warte, chyba że masz naprawdę duży tytuł. –

0

Jeśli otrzymasz tekst cyrylicowy, dla wielu postaci nie ma "najbliższej reprezentacji ASCII".

+0

+1. Transliteracja to nie prosta sprawa zastąpienia pojedynczych znaków. Albo poprawnie obsługuj Unicode, albo tylko obsługuj ASCII; wszystko pomiędzy szybko staje się bałaganem. – bobince

+0

Niemniej jednak za każdym razem, gdy pytam kogoś z Rosji o jego imię, jest on w stanie przedstawić jego wersję w wersji łacińskiej. Mam świadomość, że niektóre postacie są tylko przybliżonymi przybliżeniami, ale oczywiście musi istnieć rozwiązanie mojego problemu. –

+0

Cóż, niektóre imiona, które podają jako łacińskie odpowiedniki, nie są ich "prawdziwymi" imionami. –

0

W dokumentacji Text :: Unicode, w sekcji „Ostrzeżenia”, wydaje się, że to zdanie jest błędne:

Upewnij się, że dane wejściowe naprawdę jest ciągiem znaków utf8.

UTF-8 to kodowanie o zmiennej długości, natomiast Text :: Unidecode akceptuje kodowanie o stałej długości (dwubajtowe) dla każdego znaku. Tak że zdanie powinno brzmieć:

Upewnij się, że dane wejściowe naprawdę jest ciągiem dwa-bajtowych znaków Unicode.

Jest to również nazywane UCS-2.

Jeśli chcesz przekonwertować ciągi, które są naprawdę utf8, by to zrobić tak:

my $decode_status = utf8::decode($input_to_be_converted); 
my $converted_string = unidecode ($input_to_be_converted); 
Powiązane problemy