2010-03-26 13 views
29

किसी एल्स कोड का परीक्षण करते हुए, मैंने कुछ जेएसपी पेजों को फंकी गैर-ASCII वर्णों को प्रिंट किया।जावा स्ट्रिंग प्रतिस्थापित और एनयूएल (न्यूल, ASCII 0) चरित्र?

// remove any periods from first name e.g. Mr. John --> Mr John 
firstName = firstName.trim().replace('.','\0'); 

एक अशक्त चरित्र जावा में काम भी साथ एक स्ट्रिंग में एक चरित्र की जगह है: स्रोत में एक डुबकी ले रहा है मैं इस tidbit पाया? मुझे पता है कि '\0' एक सी-स्ट्रिंग को समाप्त कर देगा। क्या यह फंकी पात्रों के लिए अपराधी होगा?

+1

"मैंने कुछ जेएसपी पृष्ठों को फंकी गैर-असीसी वर्णों को मुद्रित किया है।": इस समस्या का मूल कारण पूरी तरह से कहीं और है। Google "मोजिबैक"। – BalusC

उत्तर

78

क्या एक चरित्र को एक नल चरित्र के साथ एक स्ट्रिंग में बदलकर जावा में भी काम करता है? मुझे पता है कि '\ 0' एक सी-स्ट्रिंग को समाप्त कर देगा।

यह इस बात पर निर्भर करता है कि आप क्या काम कर रहे हैं इसे परिभाषित करते हैं। क्या यह '\0' के साथ लक्षित चरित्र की सभी घटनाओं को प्रतिस्थापित करता है? पूर्ण रूप से!

String s = "food".replace('o', '\0'); 
System.out.println(s.indexOf('\0')); // "1" 
System.out.println(s.indexOf('d')); // "3" 
System.out.println(s.length()); // "4" 
System.out.println(s.hashCode() == 'f'*31*31*31 + 'd'); // "true" 

सबकुछ मेरे लिए ठीक काम करता प्रतीत होता है! indexOf इसे पा सकते हैं, यह लंबाई के हिस्से के रूप में गिना जाता है, और हैश कोड गणना के लिए इसका मान 0 है; सब कुछ जेएलएस/एपीआई द्वारा निर्दिष्ट है।

यह काम नहीं करता है यदि आप किसी चरित्र को नल चरित्र के साथ बदलने की अपेक्षा करते हैं तो किसी भी तरह से स्ट्रिंग से उस चरित्र को हटा देगा। बेशक यह इस तरह काम नहीं करता है। एक शून्य चरित्र अभी भी एक चरित्र है!

String s = Character.toString('\0'); 
System.out.println(s.length()); // "1" 
assert s.charAt(0) == 0; 

यह भी नहीं काम करता है अगर तुम अशक्त चरित्र एक स्ट्रिंग को समाप्त करने की उम्मीद है।यह ऊपर के टुकड़े से स्पष्ट है, लेकिन यह भी स्पष्ट रूप से JLS में निर्दिष्ट है (10.9. An Array of Characters is Not a String):

जावा प्रोग्रामिंग भाषा में, सी के विपरीत, char की एक सरणी नहीं है एक String, और न तो एक String है और न ही की एक सरणी char '\ u0000' (एनयूएल चरित्र) द्वारा समाप्त किया गया है।


इस अजीब पात्रों को दोषी होगा?

अब हम एक पूरी तरह से अलग चीज़ के बारे में बात कर रहे हैं, यानी स्क्रीन पर स्ट्रिंग कैसे प्रदान की जाती है। सच है, यहां तक ​​कि "हैलो दुनिया!" यदि आप डिंगबैट फ़ॉन्ट का उपयोग करते हैं तो फंकी लगेंगे। एक यूनिकोड स्ट्रिंग एक लोकेल में फंकी लग सकती है लेकिन दूसरी नहीं। यहां तक ​​कि एक सही ढंग से प्रस्तुत यूनिकोड स्ट्रिंग, जिसमें चीनी वर्ण भी शामिल हैं, अभी भी ग्रीनलैंड के किसी से कहने के लिए मजेदार दिख सकते हैं।

उस ने कहा, शून्य चरित्र शायद फंकी दिखता है; आमतौर पर यह एक ऐसा चरित्र नहीं है जिसे आप प्रदर्शित करना चाहते हैं। उस ने कहा, चूंकि शून्य चरित्र स्ट्रिंग टर्मिनेटर नहीं है, इसलिए जावा इसे एक या दूसरे तरीके से संभालने में सक्षम है।


अब क्या हम यह मान इच्छित प्रभाव है, यानी एक स्ट्रिंग से सभी अवधि को दूर है पता करने के लिए, सबसे आसान समाधान replace(CharSequence, CharSequence) अधिभार उपयोग करने के लिए है।

System.out.println("A.E.I.O.U".replace(".", "")); // AEIOU 

replaceAll समाधान यहाँ भी उल्लेख किया गया है, लेकिन वह नियमित अभिव्यक्ति है, जिसके कारण आप डॉट मेटा चरित्र से बचने के लिए की जरूरत है, और धीमी होने की संभावना है के साथ काम करता है।

+2

अब, यह एक अच्छा स्पष्टीकरण है। और आप सामान को प्रतिस्थापित करने के लिए सही दृष्टिकोण का उपयोग कर रहे हैं :) – BalusC

+1

+1: बहुत अच्छा और बहुत गहन! –

4

एक अशक्त चरित्र के साथ एक स्ट्रिंग में एक चरित्र की जगह भी जावा में काम करता है?

सं

इस अजीब पात्रों को दोषी होगा?

काफी संभावना है।

4

मुझे लगता है कि यह मामला होना चाहिए। चरित्र को मिटाने के लिए, आपको इसके बजाय replace(".", "") का उपयोग करना चाहिए।

+3

यह एक वाक्यविन्यास त्रुटि है। –

+0

ओह, इसका परीक्षण नहीं किया। मैं अभी इसे सही करने वाला हूँ। –

8

शायद

firstName = firstName.trim().replaceAll("\\.", ""); 
+0

मैं वास्तव में इसे ठीक करने के लिए इसका उपयोग करने जा रहा था। – praspa

+6

'replaceAll' यहां एक स्लेजहैमर की तरह है। आप सिर्फ एक खाली स्ट्रिंग द्वारा एक char को प्रतिस्थापित करना चाहते हैं। आप पैटर्न को प्रतिस्थापित नहीं करना चाहते हैं। बस 'प्रतिस्थापन ("।", "")' का उपयोग करें। – BalusC

1

इसमें बदला जाना चाहिए यह कारण नहीं है "अजीब वर्ण":

System.out.println("Mr. Foo".trim().replace('.','\0')); 

पैदा करता है:

Mr[] Foo 
मेरी ग्रहण कंसोल, जहां [] है में

एक वर्ग बॉक्स के रूप में दिखाया गया है। जैसा कि अन्य ने पोस्ट किया है, String.replace() का उपयोग करें।

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