2010-12-02 15 views
20

यह बताने का एक अच्छा तरीका क्या है कि स्ट्रिंग में दाएं से बाएं भाषा में टेक्स्ट है या नहीं।यह पता लगाने के लिए कि कोई वर्ण दाएं से बाएं भाषा से संबंधित है या नहीं?

मैं इस question जो निम्नलिखित दृष्टिकोण का सुझाव पाया है:

public bool IsArabic(string strCompare) 
{ 
    char[] chars = strCompare.ToCharArray(); 
    foreach (char ch in chars) 
    if (ch >= '\u0627' && ch <= '\u0649') return true; 
    return false; 
} 

इस अरबी के लिए काम कर सकते हैं हालांकि यह जैसे हिब्रू अन्य RTL भाषाओं को कवर करने के प्रतीत नहीं होता। क्या यह जानने का एक सामान्य तरीका है कि एक विशेष चरित्र आरटीएल भाषा से संबंधित है?

उत्तर

20

यूनिकोड वर्णों के साथ जुड़े विभिन्न गुण होते हैं। इन गुणों को कोड बिंदु से नहीं लिया जा सकता है; आपको एक टेबल की आवश्यकता है जो आपको बताती है कि क्या किसी चरित्र की एक निश्चित संपत्ति है या नहीं।

आप बिडरेक्शनल प्रॉपर्टी "आर" या "एएल" (रैंडल कैट) वाले पात्रों में रुचि रखते हैं।

ए रैंडल कैट चरित्र एक चरित्र है जो अनजाने में दाएं से बाएं दिशात्मकता के साथ है।

 
D. Bidirectional tables 

D.1 Characters with bidirectional property "R" or "AL" 

----- Start Table D.1 ----- 
05BE 
05C0 
05C3 
05D0-05EA 
05F0-05F4 
061B 
061F 
0621-063A 
0640-064A 
066D-066F 
0671-06D5 
06DD 
06E5-06E6 
06FA-06FE 
0700-070D 
0710 
0712-072C 
0780-07A5 
07B1 
200F 
FB1D 
FB1F-FB28 
FB2A-FB36 
FB38-FB3C 
FB3E 
FB40-FB41 
FB43-FB44 
FB46-FBB1 
FBD3-FD3D 
FD50-FD8F 
FD92-FDC7 
FDF0-FDFC 
FE70-FE74 
FE76-FEFC 
----- End Table D.1 ----- 

यहाँ है यूनिकोड 6.0 के रूप में पूरी सूची पाने के लिए कुछ कोड:

यहाँ यूनिकोड 3.2 (RFC 3454 से) के रूप में पूरी सूची है

var url = "http://www.unicode.org/Public/6.0.0/ucd/UnicodeData.txt"; 

var query = from record in new WebClient().DownloadString(url).Split('\n') 
      where !string.IsNullOrEmpty(record) 
      let properties = record.Split(';') 
      where properties[4] == "R" || properties[4] == "AL" 
      select int.Parse(properties[0], NumberStyles.AllowHexSpecifier); 

foreach (var codepoint in query) 
{ 
    Console.WriteLine(codepoint.ToString("X4")); 
} 

ध्यान दें कि इन मूल्यों यूनिकोड कोड अंक हैं। सी #/.NET में स्ट्रिंग्स यूटीएफ -16 एन्कोडेड हैं और पहले यूनिकोड कोड पॉइंट्स में कनवर्ट करने की आवश्यकता है (Char.ConvertToUtf32 देखें)।

static void IsAnyCharacterRightToLeft(string s) 
{ 
    for (var i = 0; i < s.Length; i += char.IsSurrogatePair(s, i) ? 2 : 1) 
    { 
     var codepoint = char.ConvertToUtf32(s, i); 
     if (IsRandALCat(codepoint)) 
     { 
      return true; 
     } 
    } 
    return false; 
} 
+0

इसके लिए धन्यवाद !! मैं बस सोच रहा था कि ब्रेंट के दृष्टिकोण के बारे में आप क्या सोचते हैं? –

+1

@ पैट्रिक क्लाउज: रेगेक्स इंजन में स्पष्ट रूप से यूनिकोड गुणों की ऐसी तालिका शामिल है। लेकिन मुझे सभी RandalCat पात्रों के लिए नामित ब्लॉक नहीं दिख रहे हैं। तो यह आपको आवश्यक शुद्धता के स्तर पर निर्भर करता है: यदि अरबी और हिब्रू का पता लगाना और कुछ अन्य पात्र आपके लिए पर्याप्त हैं, तो नियमित अभिव्यक्तियों के लिए जाएं। यदि आपको अस्तित्व में किसी भी रैंडल कैट चरित्र का पता लगाने की आवश्यकता है, तो अपनी खुद की तालिका बनाएं और ऊपर दिखाए गए इनपुट स्ट्रिंग को स्वयं जांचें। – dtb

+0

मैं सोच रहा हूं कि आप ۞ प्रतीक की क्या बात करते हैं, जिसे Google क्रोम और एमएस वर्ड जैसे सॉफ्टवेयर उत्पादों द्वारा दाएं से बाएं माना जाता है, लेकिन यूनिकोड विनिर्देश में रैंडल कैट के रूप में चिह्नित नहीं है। –

16

आप "named blocks" regular expressions में उपयोग करने का प्रयास कर सकते हैं: यहाँ एक विधि है कि जाँच करता है अगर एक स्ट्रिंग कम से कम एक RandALCat वर्ण है। बस बाईं ओर वाले ब्लॉक चुनें, और रेगेक्स बनाएं। उदाहरण के लिए:

\p{IsArabic}|\p{IsHebrew} 

कि regex सच देता है, तो फिर वहाँ कम से कम एक यहूदी या स्ट्रिंग में अरबी चरित्र था।

6

सभी "अल" या यूनिकोड 6.0 के "आर" (http://www.unicode.org/Public/6.0.0/ucd/UnicodeData.txt से)

bool hasRandALCat = 0; 
if(c >= 0x5BE && c <= 0x10B7F) 
{ 
    if(c <= 0x85E) 
    { 
     if(c == 0x5BE)      hasRandALCat = 1; 
     else if(c == 0x5C0)     hasRandALCat = 1; 
     else if(c == 0x5C3)     hasRandALCat = 1; 
     else if(c == 0x5C6)     hasRandALCat = 1; 
     else if(0x5D0 <= c && c <= 0x5EA)  hasRandALCat = 1; 
     else if(0x5F0 <= c && c <= 0x5F4)  hasRandALCat = 1; 
     else if(c == 0x608)     hasRandALCat = 1; 
     else if(c == 0x60B)     hasRandALCat = 1; 
     else if(c == 0x60D)     hasRandALCat = 1; 
     else if(c == 0x61B)     hasRandALCat = 1; 
     else if(0x61E <= c && c <= 0x64A)  hasRandALCat = 1; 
     else if(0x66D <= c && c <= 0x66F)  hasRandALCat = 1; 
     else if(0x671 <= c && c <= 0x6D5)  hasRandALCat = 1; 
     else if(0x6E5 <= c && c <= 0x6E6)  hasRandALCat = 1; 
     else if(0x6EE <= c && c <= 0x6EF)  hasRandALCat = 1; 
     else if(0x6FA <= c && c <= 0x70D)  hasRandALCat = 1; 
     else if(c == 0x710)     hasRandALCat = 1; 
     else if(0x712 <= c && c <= 0x72F)  hasRandALCat = 1; 
     else if(0x74D <= c && c <= 0x7A5)  hasRandALCat = 1; 
     else if(c == 0x7B1)     hasRandALCat = 1; 
     else if(0x7C0 <= c && c <= 0x7EA)  hasRandALCat = 1; 
     else if(0x7F4 <= c && c <= 0x7F5)  hasRandALCat = 1; 
     else if(c == 0x7FA)     hasRandALCat = 1; 
     else if(0x800 <= c && c <= 0x815)  hasRandALCat = 1; 
     else if(c == 0x81A)     hasRandALCat = 1; 
     else if(c == 0x824)     hasRandALCat = 1; 
     else if(c == 0x828)     hasRandALCat = 1; 
     else if(0x830 <= c && c <= 0x83E)  hasRandALCat = 1; 
     else if(0x840 <= c && c <= 0x858)  hasRandALCat = 1; 
     else if(c == 0x85E)     hasRandALCat = 1; 
    } 
    else if(c == 0x200F)      hasRandALCat = 1; 
    else if(c >= 0xFB1D) 
    { 
     if(c == 0xFB1D)      hasRandALCat = 1; 
     else if(0xFB1F <= c && c <= 0xFB28) hasRandALCat = 1; 
     else if(0xFB2A <= c && c <= 0xFB36) hasRandALCat = 1; 
     else if(0xFB38 <= c && c <= 0xFB3C) hasRandALCat = 1; 
     else if(c == 0xFB3E)     hasRandALCat = 1; 
     else if(0xFB40 <= c && c <= 0xFB41) hasRandALCat = 1; 
     else if(0xFB43 <= c && c <= 0xFB44) hasRandALCat = 1; 
     else if(0xFB46 <= c && c <= 0xFBC1) hasRandALCat = 1; 
     else if(0xFBD3 <= c && c <= 0xFD3D) hasRandALCat = 1; 
     else if(0xFD50 <= c && c <= 0xFD8F) hasRandALCat = 1; 
     else if(0xFD92 <= c && c <= 0xFDC7) hasRandALCat = 1; 
     else if(0xFDF0 <= c && c <= 0xFDFC) hasRandALCat = 1; 
     else if(0xFE70 <= c && c <= 0xFE74) hasRandALCat = 1; 
     else if(0xFE76 <= c && c <= 0xFEFC) hasRandALCat = 1; 
     else if(0x10800 <= c && c <= 0x10805) hasRandALCat = 1; 
     else if(c == 0x10808)     hasRandALCat = 1; 
     else if(0x1080A <= c && c <= 0x10835) hasRandALCat = 1; 
     else if(0x10837 <= c && c <= 0x10838) hasRandALCat = 1; 
     else if(c == 0x1083C)     hasRandALCat = 1; 
     else if(0x1083F <= c && c <= 0x10855) hasRandALCat = 1; 
     else if(0x10857 <= c && c <= 0x1085F) hasRandALCat = 1; 
     else if(0x10900 <= c && c <= 0x1091B) hasRandALCat = 1; 
     else if(0x10920 <= c && c <= 0x10939) hasRandALCat = 1; 
     else if(c == 0x1093F)     hasRandALCat = 1; 
     else if(c == 0x10A00)     hasRandALCat = 1; 
     else if(0x10A10 <= c && c <= 0x10A13) hasRandALCat = 1; 
     else if(0x10A15 <= c && c <= 0x10A17) hasRandALCat = 1; 
     else if(0x10A19 <= c && c <= 0x10A33) hasRandALCat = 1; 
     else if(0x10A40 <= c && c <= 0x10A47) hasRandALCat = 1; 
     else if(0x10A50 <= c && c <= 0x10A58) hasRandALCat = 1; 
     else if(0x10A60 <= c && c <= 0x10A7F) hasRandALCat = 1; 
     else if(0x10B00 <= c && c <= 0x10B35) hasRandALCat = 1; 
     else if(0x10B40 <= c && c <= 0x10B55) hasRandALCat = 1; 
     else if(0x10B58 <= c && c <= 0x10B72) hasRandALCat = 1; 
     else if(0x10B78 <= c && c <= 0x10B7F) hasRandALCat = 1; 
    } 
} 
1

संपादित करें:

यह अब मैं क्या उपयोग है, यह Vowelization वर्ण और हिब्रू में सब कुछ शामिल है और अरबी:

[\u0591-\u07FF] 

पुराने उत्तर:

आप एक वाक्य में RTL भाषा का पता लगाने की जरूरत है, इस सरलीकृत रेगुलर एक्सप्रेशन से शायद काफी होगा:

[א-ת؀-ۿ] 

एक हिब्रू में कुछ यह इन पात्रों में से एक का उपयोग करना होगा लिखने के लिए चाहता है, और मामला अरबी के समान है।

इसमें स्वरीकरण वर्ण शामिल नहीं हैं, इसलिए यदि आपको सभी पूरे शब्दों को पकड़ने की ज़रूरत है या बिल्कुल सभी आरटीएल वर्ण आप बेहतर उत्तरों में से एक का उपयोग करते हैं। गैर-कविता ग्रंथों में हिब्रू में स्वरीकरण वर्ण बहुत दुर्लभ हैं। मुझे अरबी ग्रंथों के बारे में पता नहीं है।

संबंधित मुद्दे

 संबंधित मुद्दे