2013-03-07 6 views
9

मेरे पास एक ऐसा प्रोग्राम है जो किसी भी वर्ण को हटाकर स्ट्रिंग को फ़िल्टर करता है जो एक अक्षर या अंक नहीं है। इस कार्यक्रम का समर्थन भाषाओं के एक उच्च संख्या है, जो चीनी, रूसी, अरबी, शामिल आदि कार्यक्रम के रूप में नीचे है:क्या Character.isLetter को सामान्यीकृत पाठ की आवश्यकता है?

StringBuilder strBuilder = new StringBuilder(); 

for (int i = 0; i < src.length(); i++) { 
    int ch = src.codePointAt(i); 
    if (Character.isLetterOrDigit(ch)) { 
     strBuilder.appendCodePoint(ch); 
    } 
} 

मैं codePointAt विधि का उपयोग पात्रों कि UTF में उच्च और निम्न के माध्यम से 32 बिट्स व्यक्त कर रहे हैं का समर्थन करने के किराए की। मुझे फ़िल्टरिंग करने से पहले प्रत्येक स्ट्रिंग को सामान्यीकृत करने की आवश्यकता है या नहीं? मैं लूप निष्पादित करने से पहले Normalizer.normalize विधि को कॉल करने का जिक्र कर रहा हूं। यदि हां, तो Normalizer.Form का उपयोग करना चाहिए?

धन्यवाद।

+1

क्या आप दोनों मामलों के लिए परीक्षण नहीं बना सकते हैं, यानी सामान्यीकरण के साथ और बिना परिणामों के तुलना करें? – Henrik

उत्तर

0

ध्यान दें, कि कोड पॉइंट्स पुनरावृत्ति के लिए अपने कोड काफी सही नहीं है, मेरा मानना ​​है आप चाहते हैं:

for(int cp, i = 0; i < s.length(); i += Character.charCount(cp)) { 
    cp = s.codePointAt(i); 
    // Process cp... 
} 

माफ करना, अगर आप को सामान्य या नहीं करने के लिए, हालांकि जरूरत है पता नहीं है।

+0

ठीक है इस पकड़ के लिए धन्यवाद। क्या आपके पास Normalizer का उपयोग करने के सवाल के बारे में कोई सुराग है या नहीं? – user2144762

4

यह सब इस बात पर निर्भर करता है कि आप वास्तव में अपने एल्गोरिदम को कैसे व्यवहार करना चाहते हैं।

उदाहरण के लिए, हमें स्ट्रिंग "a\u0308" (U + 0061   ʟᴀᴛɪɴ   sᴍᴀʟʟ   ʟᴇᴛᴛᴇʀ   ᴀ U + 0308   ᴄᴏᴍʙɪɴɪɴɢ   ᴅɪᴀᴇʀᴇsɪs के बाद) है, जो धर्मविधान "ä" या "\u00e4" (U + 00E4   के बराबर है पर विचार करते हैं ʟᴀᴛɪɴ   एसᴍᴀʟʟ   ʟᴇᴛᴛᴇʀ   ᴀ   ᴡɪᴛʜ   ᴅɪᴀᴇʀᴇsɪs)। कैननिक रूप से समकक्ष होने का मतलब है कि आपके एल्गोरिदम को इन दोनों के बीच भेद नहीं करना चाहिए। व्यवहार करने के लिए वैचारिक रूप से समकक्ष तारों को प्राप्त करने का एक आसान तरीका दोनों को समान कैननिकल सामान्यीकरण फ़ॉर्म में सामान्य बनाना है: या तो एनएफसी या एनएफडी।

इन तारों का प्रतिनिधित्व करने के आधार पर, आप इसके बजाय संगतता समतुल्य (एनएफकेसी या एनएफकेडी) का उपयोग करना चाह सकते हैं। आमतौर पर इसकी पहचान की जाती है, उदाहरण के लिए, पहचानकर्ता। ये दो संगतता वर्णों को उनके अनुशंसित समकक्षों (जैसे यू + 2126   ᴏʜᴍ   एसɪɢɴ से यू + 03 ए 9   ɢʀᴇᴇᴋ   ᴄᴀᴘɪᴛᴀʟ   ʟᴇᴛᴛᴇʀ   ᴏᴍᴇɢᴀ, या वर्णित वर्णों के अनुक्रमों के लिए लिगरेचर कारकर्स)।

चाहे आप किस तरह के समकक्ष चाहते हैं, सिद्धांत भी वही रहता है: यदि आप समकक्ष तारों का इलाज करना चाहते हैं तो दोनों सामान्य रूप से सामान्यीकरण करना सबसे आसान तरीका है।

एक बार जब आप सभी समकक्ष तारों के लिए एक ही व्यवहार करते हैं, तो आपको एक और समस्या पर विचार करने की आवश्यकता होती है: यदि आप सभी "चरित्र [ओं] को छोड़ रहे हैं जो एक पत्र या अंक नहीं हैं", तारों के साथ क्या होता है पत्र और संयोजन के निशान, "\u092C\u093F" की तरह साथ (U + 092 C   ᴅᴇᴠᴀɴᴀɢᴀʀɪ   ʟᴇᴛᴛᴇʀ   ʙᴀ यू द्वारा पीछा + 093F   ᴅᴇᴠᴀɴᴀɢᴀʀɪ   ᴠᴏᴡᴇʟ   sɪɢɴ   ɪ, बि तरह दिखता है)? ये दो अलग कोडपॉइंट हैं, और यू +0 9 3 एफ एक पत्र नहीं है। ये दोनों किसी भी सामान्यीकरण रूप में नहीं लिखते हैं। क्या आप संयोजन अंक को छोड़ना चाहते हैं (आपको बी के साथ छोड़कर), या नहीं?

यदि उन्हें छोड़ना ठीक है, तो आप अपने वर्तमान एल्गोरिदम का उपयोग कर सकते हैं। अन्यथा, आप शायद ग्रैफेम क्लस्टर्स पर फिर से शुरू करना चाहते हैं, जो मोटे तौर पर, आधार वर्णों के अनुक्रम होते हैं, इसके बाद संयोजन चिह्न होते हैं।Java और ICU दोनों ग्रेफेम क्लस्टर खोजने के लिए एपीआई प्रदान करते हैं (जावा इन "चरित्र ब्रेक" को कॉल करता है)।

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