كيف يمكنني تحويل أحرف غير ASCII ترميز UTF8 في لASCII مكافئ في بيرل؟

StackOverflow https://stackoverflow.com/questions/638060

سؤال

ولدي مخطوطة برل التي يتم استدعاء من قبل أطراف ثالثة أن ترسل لي أسماء الأشخاص الذين سجلوا برنامجي. واحدة من هذه الأحزاب بترميز الأسماء في UTF-8، لذلك تكيفت مخطوطتي وفقا لذلك لفك UTF-8 إلى ASCII مع شفر :: decode_utf8 (...).

وهذه عادة ما يعمل بشكل جيد، ولكن كل 6 أشهر أو نحو ذلك من الأسماء يحتوي على أحرف السيريلية، اليونانية أو الرومانية، لذلك فك نتائج اسم بأحرف القمامة مثل "ПоÐ'Ñ € Ð ° жР° нÑкР° Ñ ". لا بد لي من متابعة مع العميل ويطلب منه ل"نسخة الطابع اللاتيني" من اسمه لإصدار قانون التسجيل.

وهكذا، هل هناك أي وحدة بيرل التي يمكن الكشف عن ما إذا كانت هناك مثل هذه الشخصيات ويترجم لهم أقرب تمثيل ASCII في حال الضرورة تلقائيا؟

ويبدو أنني يمكن استخدامها لينجوا :: :: السيريلية TRANSLIT :: منظمة الطيران المدني الدولي بالإضافة لينجوا :: DetectCharset للتعامل مع السيريلية، لكنني أفضل شيء أن يعمل مع حرف آخر يحدد كذلك.

هل كانت مفيدة؟

المحلول

وأعتقد أنك يمكن أن تستخدم النص :: Unidecode للحصول على هذا، هذا هو بالضبط ما يحاول أن تفعله.

نصائح أخرى

إذا كان لديك للتعامل مع UTF-8 البيانات التي ليست في نطاق أسكي، وأفضل رهان هو تغيير الخلفية الخاصة بك حتى لا خنق على UTF-8. كيف يمكنك أن تذهب نحو ترجمة صوتيا علامات كانجي؟

إذا تحصل النص السيريلية لا يوجد "أقرب تمثيل ASCII" عن العديد من الشخصيات.

في وثائق النص :: يونيكود، تحت عنوان "المحاذير"، يبدو أن هذه العبارة غير صحيحة:

تأكد من أن البيانات المدخلة هي في الحقيقة سلسلة UTF8.

وUTF-8 هو ترميز متغير الطول، في حين أن النص :: Unidecode لا يقبل إلا ترميز طول ثابت (اثنين بايت) لكل حرف. بحيث الجملة كما يلي:

تأكد من أن البيانات المدخلة هي في الحقيقة سلسلة من أحرف Unicode اثنين بايت.

وهذا ويشار أيضا إلى أنه UCS-2.

إذا كنت تريد تحويل السلاسل التي هي في الحقيقة UTF8، هل تفعل ذلك كما يلي:

my $decode_status = utf8::decode($input_to_be_converted);
my $converted_string = unidecode ($input_to_be_converted);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top