2011-09-09 12 views
27

मैं जावा में किसी शब्द को कैपिटल करने के बारे में प्रश्नों के बाज़िलियन में सभी स्टैक ओवरव्लो को देख रहा हूं, और उनमें से कोई भी कम से कम अंतर्राष्ट्रीयकरण के बारे में परवाह नहीं करता है और वास्तव में कोई भी वास्तव में प्रतीत नहीं होता है एक अंतरराष्ट्रीय संदर्भ में काम करने के लिए। तो ये रहा मेरा प्रश्न।जावा में यूनिकोड-सही शीर्षक केस

मेरे पास जावा में एक स्ट्रिंग है, जो एक शब्द का प्रतिनिधित्व करता है - सभी isLetter() अक्षर, कोई सफेद जगह नहीं है। मैं पहला चरित्र ऊपरी मामला और शेष निचला मामला बनाना चाहता हूं। मेरे पास काम में मेरे शब्द का लोकेल है।

मेरी स्ट्रिंग के अंतिम भाग के लिए .substring (1) .toLowerCase (लोकेल) को कॉल करना काफी आसान है। मुझे नहीं पता कि सही पहला चरित्र कैसे प्राप्त करें।

मेरी पहली समस्या डच के साथ है, जहां "ij" एक digraph होने के साथ एक साथ पूंजीकृत किया जाना चाहिए। मैं हाथ से यह विशेष मामला कर सकता था, क्योंकि मुझे इसके बारे में पता है; अब इस तरह की चीज के साथ अन्य भाषाएं हो सकती हैं जिन्हें मैं नहीं जानता, और मुझे यकीन है कि अगर मैं अच्छी तरह से पूछूं तो यूनिकोड मुझे बताएगा। लेकिन मुझे नहीं पता कि कैसे पूछना है।

भले ही उपरोक्त समस्या हल हो जाए, फिर भी मैं अंग्रेजी, तुर्की और ग्रीक को संभालने के लिए कोई उचित तरीका नहीं हूं, क्योंकि चरित्र शीर्षक शीर्षक का समर्थन करता है लेकिन कोई लोकेल नहीं है, और स्ट्रिंग लोकेशंस का समर्थन करता है लेकिन शीर्षक नहीं।

यदि मैं कोड बिंदु लेता हूं, और इसे Character.toTitleCase() पर भेजता हूं, तो यह विफल हो जाएगा क्योंकि इस विधि में लोकेल को पास करने का कोई तरीका नहीं है। तो अगर सिस्टम लोकेल अंग्रेजी में है लेकिन शब्द तुर्की है, और शब्द का पहला अक्षर "मैं" है, तो मुझे "आई" के बजाय "मैं" मिल जाएगा और यह गलत है। अब अगर मैं एक सबस्ट्रिंग लेता हूं और उपयोग करता हूं .toUpperCase (लोकेल), यह असफल हो जाएगा क्योंकि यह ऊपरी है और शीर्षक का मामला नहीं है। तो अगर शब्द ग्रीक है, तो मुझे अभी भी गलत चरित्र मिल जाएगा।

यदि किसी के पास उपयोगी पॉइंटर्स हैं, तो मुझे उन्हें सुनकर खुशी होगी।

+0

'toTitleCase() 'को लोकेल की आवश्यकता नहीं है, क्योंकि यह लोकेल स्वतंत्र है। --- यदि आप दो अक्षर 'ij' को एक digraph होना चाहते हैं, तो आपको इसे डिग्राफ यूनिकोड वर्ण' ij' (['लैटिन लघु लिगेट IJ' (U + 0133)] में परिवर्तित करना चाहिए (http: // www। fileformat.info/info/unicode/char/0133/index.htm))। – Andreas

उत्तर

3

समस्या यह है कि ऊपरी और निचले केस अक्षरों का अंतर बहुत भाषा विशिष्ट है। इतने सारे, शायद अधिकतर भाषाओं में ऐसा नहीं है।

वैसे भी, वहाँ एक यूनिकोड पूछे जाने वाले प्रश्न है: http://www.unicode.org/faq/casemap_charprop.html

..और मुझे लगता है कि वहाँ एक यूनिकोड विशिष्ट मानचित्रण तालिका कहीं (कि ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt की तरह कुछ) है। तो शायद अपनी खुद की रूपांतरण विधि का उपयोग करना सबसे अच्छा है।

6

आप की तरह, मैं कोर जावा एपीआई में एक उपयुक्त विधि नहीं ढूंढ पाया।

हालांकि, locale-sensitive string-title-case method (UCharacter#toTitleCase) in the ICU library प्रतीत होता है।


प्रासंगिक आईसीयू विधियों (UCharacter#toTitleCase और UCaseProps#toUpperOrTitle) के लिए स्रोत को देखते हुए, वहाँ कई स्थान-विशिष्ट शीर्षक-आवरण के लिए विशेष मामलों होने लगते हैं नहीं है, इसलिए आप के साथ भाग प्राप्त करने में सक्षम हो सकता है निम्नलिखित:

  1. स्ट्रिंग में पहला कैस्ड वर्ण खोजें।
  2. यदि उसके शीर्षक-केस फॉर्म के ऊपरी-केस फॉर्म से अलग है, तो इसका उपयोग करें।
  3. अन्यथा, उस पहले वर्ण और उसके संयोजन वर्णों पर लोकेल-संवेदनशील ऊपरी-केस निष्पादित करें।
  4. बाकी स्ट्रिंग पर लोकेल-संवेदनशील लोअर-केस करें।
  5. यदि लोकेल डच है और पहला कैस्ड कैरेक्टर "आई" है, उसके बाद "जे", ऊपरी केस "जे" है।
4

केवल दो वर्ण डिग्राफ जिसमें दोनों पात्र एक बार में पूंजीकृत होते हैं और संभवतः आप वास्तविक जीवन कार्यक्रम में सामना करेंगे, डच आईजे है। अगर लोकेल डच है तो बस इसे संभाल लें। सबसे खराब असंभव परिदृश्य में, 1-2 मामले होंगे जिन्हें आपको बाद में जोड़ने की आवश्यकता होगी, ऐसा नहीं है कि आपको हर दिन नए पूंजीकरण डिग्राफ का सामना करना पड़ेगा, इसलिए यहां सामान्यीकरण पर ध्यान देने योग्य नहीं है।

नोट, सामान्य रूप से, किसी भी शीर्षक या ऊपरी मामले को मनमानी भाषा के लिए चरित्र रूपांतरण में चरित्र का उपयोग करना संभव नहीं है। कुछ निचले केस वर्ण एक से अधिक ऊपरी केस वर्णों में अनुवाद करते हैं। तो आपको एक सामान्य मामले में स्ट्रिंग का उपयोग करना होगा।

लेकिन शीर्षक केस लोकेल के साथ कोई समस्या नहीं है। ToTitleCase() विधि कैसे काम करता है इसके बारे में शायद एक छोटी गलतफहमी है। यह शीर्षक केस किसी भी चरित्र में परिवर्तित हो जाएगा, जिसमें पहले से ही ऊपरी मामले में है।

उदाहरण के लिए, dž चरित्र पर विचार करें।

System.out.println(Character.toUpperCase('\u01C4')); 
DŽ 

और

System.out.println(Character.toTitleCase('\u01C4')); 
Dž 

तथापि, निम्नलिखित भी दे देंगे शीर्षक मामले

System.out.println(Character.toTitleCase(Character.toUpperCase('\u01C4'))); 
Dž 

तो: यह अपर केस रूप DŽ है और शीर्षक मामले प्रपत्र Dž है , यदि आप टाइटल केस से पहले लोकेल से ऊपरी मामले में कनवर्ट करते हैं, तो आपको सही कोड पॉइंट मिलता है और कोई प्रॉब्लल नहीं होता है उन्हें परिणाम पर शीर्षक केस का उपयोग करने, सहित तुर्की, आदि .:

System.out.println(Character.toTitleCase("dž".toUpperCase().charAt(0))); 
System.out.println(Character.toTitleCase("i".toUpperCase(Locale.forLanguageTag("tr")).charAt(0))); 
Dž 
İ 

ध्यान दें, सिर्फ एक एकल चरित्र के शीर्षक केस का उपयोग करके अगर कोई इसके ऊपरी मामले से एक फर्क है एक सामान्य मामले में सही है नहीं ।

संक्षेप में:

  • हैंडल डच संयुक्ताक्षर (या अन्य द्वि आलेख अगर तुम उन्हें सामना करते हैं, मैं अत्यधिक है कि शक है और सबसे खराब यह कार्यक्रम जीवन भर के लिए 1-2 मामलों हो जाएगा)।
  • लोकेल और टॉपरकेस()
  • का उपयोग कर आवश्यक वर्णों को स्ट्रिंग के रूप में कनवर्ट करें कैरेक्टर टू टिटलकेस का उपयोग करके ToUpperCase परिणाम के सभी वर्णों को कनवर्ट करें।

ध्यान दें, अभी भी कुछ पूंजीकरण मामलों इस संदर्भ बारे में जानते हैं, आयरिश उपसर्ग की तरह, अंग्रेजी एफएफ नाम, आदि जो सिर्फ एक चरित्र/स्ट्रिंग प्रसंस्करण से अधिक की आवश्यकता है, लेकिन मुझे शक है आप शीर्षक के लिए उन्हें संभाल करने की जरूरत है एक कार्यक्रम में पीढ़ी।

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