2009-03-12 33 views
7

Tôi có một tập lệnh Perl đang được bên thứ ba gọi để gửi cho tôi tên của những người đã đăng ký phần mềm của tôi. Một trong những bên này mã hóa các tên trong UTF-8, vì vậy tôi đã điều chỉnh kịch bản của tôi cho phù hợp để giải mã UTF-8 thành ASCII với Encode :: decode_utf8 (...).Làm cách nào để chuyển đổi các ký tự không phải ASCII được mã hóa theo UTF8 thành ASCII tương đương trong Perl?

Điều này thường hoạt động tốt, nhưng cứ sau 6 tháng, một trong các tên có chứa ký tự cyrillic, greek hoặc rumani, do đó giải mã các kết quả tên trong các ký tự rác như "ĐŸŸ Ñ ​​". Tôi phải theo dõi với khách hàng và yêu cầu anh ta cho một "phiên bản nhân vật latin" của tên của mình để phát hành một mã số đăng ký.

Vì vậy, có bất kỳ mô-đun Perl nào có thể phát hiện xem có các ký tự như vậy và tự động dịch chúng sang biểu diễn ASCII gần nhất của chúng nếu cần thiết không?

Có vẻ như tôi có thể sử dụng Lingua :: Cyrillic :: Translit :: ICAO cộng với Lingua :: DetectCharset để xử lý Cyrillic, nhưng tôi thích thứ gì đó hoạt động với các bộ ký tự khác.

Trả lời

12

Tôi tin rằng bạn có thể sử dụng Text::Unidecode cho việc này, đó chính xác là những gì nó cố gắng làm.

+0

Chỉ là những gì tôi đang tìm kiếm - Cảm ơn! :-) –

0

Nếu bạn phải đối phó với dữ liệu UTF-8 không nằm trong phạm vi ascii, đặt cược tốt nhất của bạn là thay đổi phần phụ trợ của bạn để nó không bị nghẹt thở trên utf-8. Làm thế nào bạn sẽ đi về chuyển ngữ chữ kanji?

+0

Trong vòng hơn 10 năm phát triển phần mềm chia sẻ, tôi chỉ có một số ít khách hàng từ Nhật Bản và Trung Quốc. Unicode cho phép tất cả các chương trình phần mềm chia sẻ của tôi chỉ để chăm sóc một sự phiền toái nhẹ sẽ được phóng đại. Tôi đang tìm kiếm một cách tiếp cận nhanh chóng và bẩn trong trường hợp này. –

+0

Vì vậy, có thể (chỉ có thể), bạn có thể tìm thấy nhiều khách hàng hơn nếu bạn bật utf-8? – innaM

+0

Một số ít: có. Rất nhiều và đáng giá thời gian phát triển: Số Piracy là một vấn đề rất lớn trong kinh doanh phần mềm chia sẻ, đặc biệt là ở các nước như Trung Quốc. Thị trường Nhật Bản không phải là xấu, nhưng từ những gì tôi đã nghe từ các tác giả phần mềm chia sẻ khác nó thường là không có giá trị nó, trừ khi bạn có một tiêu đề thực sự lớn. –

0

Nếu bạn nhận được văn bản cyrilic, không có "đại diện ASCII gần nhất" cho nhiều ký tự.

+0

+1. Chuyển ngữ không phải là một doanh nghiệp đơn giản thay thế các ký tự đơn. Hỗ trợ Unicode đúng cách hoặc chỉ hỗ trợ ASCII; bất cứ điều gì ở giữa được lộn xộn nhanh chóng. – bobince

+0

Tuy nhiên bất cứ khi nào tôi hỏi ai đó từ Nga cho tên của mình, ông có thể cung cấp một phiên bản nhân vật latin của nó. Tôi biết rằng một số ký tự chỉ là xấp xỉ thô, nhưng rõ ràng là phải có giải pháp cho vấn đề của tôi. –

+0

Vâng, một số tên họ cung cấp cho bạn như là tương đương latin không phải là tên "thực" của họ. –

0

Trong tài liệu hướng dẫn cho Text :: Unicode, dưới "Hãy cẩn thận", dường như cụm từ này là không chính xác:

Hãy chắc chắn rằng các dữ liệu đầu vào thực sự là một chuỗi utf8.

UTF-8 là mã hóa có độ dài thay đổi, trong khi văn bản :: Unidecode chỉ chấp nhận mã hóa độ dài cố định (hai byte) cho mỗi ký tự. Vì vậy, câu đó nên đọc:

Đảm bảo rằng dữ liệu đầu vào thực sự là một chuỗi ký tự Unicode hai byte.

Điều này còn được gọi là UCS-2.

Nếu bạn muốn chuyển đổi chuỗi mà thực sự là utf8, bạn sẽ làm điều đó như sau:

my $decode_status = utf8::decode($input_to_be_converted); 
my $converted_string = unidecode ($input_to_be_converted); 
Các vấn đề liên quan