سؤال

ما هي أبسط طريقة لترليف الشخصيات غير الإنجليزية في روبي. هذا هو التحويل مثل:

translit "Gévry"
#=> "Gevry"

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

المحلول

روبي لديه أيقونة مكتبة في Stdlib التي تحول الترميزات بطريقة مشابهة جدا للو المعتاد iconv أمر

نصائح أخرى

استخدم ال Unicodeutils. جوهرة. هذا يعمل في 1.9 و 2.0. تم إهمال ICONV في هذه الإصدارات.

gem install unicode_utils

ثم جرب هذا في IRB:

2.0.0p0 :001 > require 'unicode_utils'  #=> true
2.0.0p0 :002 > r = "Résumé"             #=> "Résumé"
2.0.0p0 :003 > r.encoding               #=> #<Encoding:UTF-8>
2.0.0p0 :004 > UnicodeUtils.nfkd(r).gsub(/(\p{Letter})\p{Mark}+/,'\\1')
                                        #=> "Resume"

الآن شرح كيف يعمل هذا!

أولا، عليك تطبيع السلسلة في nfkd. (نموذج التطبيع (K) تنسيق التحلل العامل. "É" Unicode CodePoint، المعروف باسم "رسالة صغيرة لاتينية ه مع الحادة"، يمكن تمثيل بطريقتين:

  • é = U + 00E9
  • é = (e = u + 0065) + (حاد = u + 0301)

مع النموذج الأول هو الأكثر شعبية كوسعة رمز واحد. النموذج الثاني هو التنسيق المتحلل، يفصل Grapeme (ما الذي يظهر ك "É" على شاشتك) في نقاط التعليمات البرمجية الخاصة بهين، ASCII "E" وعلامة اللكنة الحادة. يمكن لأجهزة Unicode إنشاء جرب من العديد من نقاط التعليمات البرمجية، وهو مفيد في بعض أنظمة الكتابة الآسيوية.

ملاحظة تريد عادة تطبيع بياناتك بتنسيق قياسي للمقارنة أو الفرز، إلخ. في Ruby التنسيقتين من "É" هنا غير متساوي (). في IRB، قم بذلك:

> "\u00e9"                   #=> "é"
> "\u0065\u0301"             #=> "é"
> "\u00e9" == "\u0065\u0301" #=> false
> "\u00e9" > "\u0065\u0301"  #=> true
> "\u00e9" >= "f"            #=> true  (composed é > f)
> "\u0065\u0301" > "f"       #=> false (decomposed é < f)

> "Résumé".chars.count       #=> 6
> decomposed = UnicodeUtils.nfkd("Résumé")  
                             #=> "Résumé"
> decomposed.chars.count     #=> 8
> decomposed.length          #=> 6
> decomposed.gsub(/(\p{Letter})\p{Mark}+/,'\\1')
                             #=> "Resume"

الآن بعد أن لدينا السلسلة بتنسيق NFKD، يمكننا تطبيق تعبير منتظم باستخدام بناء جملة "اسم الخاصية" ( p {property_name}) لمطابقة خطاب متبوعا بحرف واحد أو أكثر من علامات "علامات". من خلال التقاط خطاب المطابقة، يمكننا استخدام GSUB لاستبدال الحرف + درعيات بواسطة الرسالة الملتقطة خلال السلسلة.

تتم إزالة هذه التقنية علامات التشويم من أحرف ASCII ولن ترجم مجموعات الأحرف مثل السلاسل اليونانية أو السيريلية في أحرف ASCII المكافئة.

حاول إلقاء نظرة على هذا البرنامج النصي من TechniconseIls التي تحل محل الشخصيات المعلمة في سلسلة. مثال على الاستخدام:

"Gévry".removeaccents #=> Gevry
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top