2017-10-30 8 views
7

मुझे https://www.w3.org/2005/xpath-functions/collation/html-ascii-case-insensitive/ से संबंधित एक कोलेटर बनाने की आवश्यकता है यानी यह तुलना करते समय ASCII A-Z और a-z वर्णों की केस संवेदनशीलता को अनदेखा करता है।एचटीएमएल ASCII केस असंवेदनशील आईसीयू कोलेटर

मैं निम्नलिखित ICU4j RuleBasedCollator के साथ इस प्रयास किया है:

final RuleBasedCollator collator = 
     new RuleBasedCollator("&a=A, b=B, c=C, d=D, e=E, f=F, g=G, h=H, " 
       + "i=I, j=J, k=K, l=L, m=M, n=N, o=O, p=P, q=Q, r=R, s=S, t=T, " 
       + "u=U, v=V, u=U, v=V, w=W, x=X, y=Y, z=Z").freeze(); 

हालांकि, निम्नलिखित तुलना विफल है, जहां मैं इसे सफल होने के लिए उम्मीद करेंगे (यानी लौट true) लगता है:

final SearchIterator searchIterator = new StringSearch(
     "pu", new StringCharacterIterator("iNPut"), collator); 
return searchIterator.first() >= 0; 

मेरे नियमों में मुझे क्या याद आ रही है?

उत्तर

2

com.ibm.icu.text.RuleBasedCollator#compare

एक पूर्णांक मान देता है। मूल्य शून्य से कम है, तो स्रोत लक्ष्य से कम है, मान शून्य है अगर स्रोत और लक्ष्य समान हैं, मान है शून्य से अधिक है, तो स्रोत से लक्षित कर

String a = "Pu"; 
String b = "pu"; 

RuleBasedCollator c1 = (RuleBasedCollator) Collator.getInstance(new Locale("en", "US", "")); 
RuleBasedCollator c2 = new RuleBasedCollator("& p=P"); 
System.out.println(c1.compare(a, b) == 0); 
System.out.println(c2.compare(a, b) == 0); 

Output 
====== 
false 
true 

ऐसा प्रतीत होता है अधिक से अधिक है नियम यह नहीं है कि समस्या कहां है, कुछ खोजकर्ता कोड के साथ गलत लगता है।


यदि आपको सर्चइटरेटर का उपयोग करने की आवश्यकता नहीं है तो शायद आप अपनी खुद की 'शामिल' विधि लिख सकते हैं। शायद इस तरह कुछ:

boolean contains(String a, String b, RuleBasedCollator c) { 
    int index = 0; 
    while (index < a.length()) { 
    if (a.length() < b.length()) { 
     return false; 
    } 

    if (c.compare(a.substring(0, b.length()), b) == 0) { 
     return true; 
    } 

    a = a.substring(1); 
    } 
    return false; 
} 

शायद दुनिया में सबसे अच्छा कोड नहीं है, लेकिन आपको विचार मिलता है।

+0

हम्म कि दिलचस्प है। मुझे आश्चर्य है कि नियम असमान हैं? जैसे दोनों दिशाओं में तुलना करने के लिए, क्या मुझे '" और पी = पी, पी = पी "को परिभाषित करने की आवश्यकता होगी? – adamretter

+0

बराबर चिह्न दोनों तरीकों से काम करता है इसलिए नियम भी होना चाहिए, हां? – ParallelNoob

+0

[आईसीयू कॉललेटर अनुकूलन उपयोगकर्ता मार्गदर्शिका] से (http://userguide.icu-project.org/collation/customization): x = y, "x" और "y" के बीच कोई अंतर नहीं दर्शाता है। – ParallelNoob

3
  1. यह डब्ल्यू 3 सी "संयोजन" सामान्य अर्थ में कोलेटर की तरह नहीं दिखता है। यह आदेश के बिना एक ASCII-case-असंवेदनशील matcher है। मुझे संदेह है कि इसे आम तौर पर कम-स्तरीय कोड के साथ कार्यान्वित किया जाता है जो एएससीआईआई अक्षरों के मामले से असंवेदनशील रूप से मेल खाता है और बाकी सब कुछ ठीक से। https://www.w3.org/TR/xpath-functions-31/#html-ascii-case-insensitive-collation

  2. कोलेटर नियम शायद ऐसा नहीं करते जो आप सोचते हैं कि वे करते हैं। कॉमा एक तृतीयक अंतर के लिए पुराना वाक्यविन्यास है, इसलिए &a=A, b=B, c=C&a=A<<<b=B<<<c=C जैसा ही है। मुझे लगता है कि आप &a=A &b=B &c=C आदि की तरह कुछ इच्छुक थे

+1

ठीक है कि समझ में आता है धन्यवाद।हालांकि मुझे अभी भी एक स्ट्रिंग लिखने में समस्याएं हैं जिनमें 'सर्चइटरेटर' का उपयोग करके विधि शामिल है। मैंने अपने प्रश्न से कोड लिया और संयोजन नियमों को बदल दिया: '& a = ए और बी = बी और सी = सी एंड डी = डी एंड ई = ई और एफ = एफ एंड जी = जी एंड एच = एच एंड आई = आई एंड जे = जे एंड के = के एंड एल = एल एंड एम = एम एंड एन = एन एंड ओ = ओ एंड पी = पी एंड क्यू = क्यू एंड आर = आर एंड एस = एस एंड टी = टी एंड यू = यू एंड वी = वी एंड डब्ल्यू = डब्ल्यू एंड एक्स = एक्स एंड वाई = वाई एंड जेड = जेड 'लेकिन' सर्चइटरेटर। फर्स्ट () 'अभी भी '-1' देता है। – adamretter

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