2009-12-10 18 views
45

अद्यतनसबसे विश्वसनीय विभाजन चरित्र

आप एक विभाजन विधि पर एक चार का उपयोग करने के लिए मजबूर किया गया, तो जो चार सबसे विश्वसनीय हो सकता है?

भरोसेमंद परिभाषा: एक विभाजित चरित्र जो अलग-अलग उप तारों का हिस्सा नहीं है।

+0

वहाँ एक कारण है कि आप के साथ * ग # * इस टैग किया है? मुझे कोई कारण नहीं दिख रहा है कि यह भाषा से संबंधित क्यों होना चाहिए। –

+1

.NET WinForm में स्ट्रिंग ऑपरेशन करते समय, \ \' एक टर्मिनेटर वर्ण होता है जब फॉर्म नियंत्रण शामिल होते हैं। –

उत्तर

50

वर्तमान में हम

public const char Separator = ((char)007); 

का उपयोग मुझे लगता है कि इस बीप आवाज़ है, अगर मैं गलत नहीं हूँ।

+2

तो मुझे उम्मीद है कि यह कोशिश करने और पकड़ने वाले ब्लॉक से अपवाद संदेशों में कभी नहीं होना चाहिए? –

+0

यह सुनिश्चित नहीं है कि यह सबसे अच्छा जवाब है, लेकिन यह मुझे दिया गया था से सबसे मूल था। –

+7

नाम बीप है। कंसोल बीप। ;) – RCIX

4

वहाँ String.Split की overloads कि स्ट्रिंग विभाजक ले रहे हैं ...

8

मैं आमतौर पर एक 'पसंद करते हैं | 'विभाजित चरित्र के रूप में प्रतीक। यदि आप इस बात के बारे में सुनिश्चित नहीं हैं कि पाठ में कौन सा उपयोगकर्ता प्रवेश करता है तो आप उपयोगकर्ता को कुछ विशेष पात्रों में प्रवेश करने से प्रतिबंधित कर सकते हैं और आप उन पात्रों, विभाजित चरित्र से चुन सकते हैं।

1

यह किस संदर्भ में उसे प्रयोग किया जाता है पर बहुत ज्यादा निर्भर करता है। यदि आप एक बहुत ही सामान्य सीमांकित चरित्र के बारे में बात कर रहे हैं तो मुझे नहीं लगता कि एक आकार-फिट है-सभी जवाब।

मुझे लगता है कि ASCII शून्य चरित्र '\ 0' अक्सर एक अच्छा उम्मीदवार होता है, या आप निट्ज़महोन के विचार के साथ जा सकते हैं और एक से अधिक वर्णों का उपयोग कर सकते हैं, तो यह जितना चाहें उतना पागल हो सकता है।

वैकल्पिक रूप से, आप इनपुट को पार्स कर सकते हैं और अपने सीमित चरित्र के किसी भी उदाहरण से बच सकते हैं।

5

\ 0 एक अच्छा विभाजन चरित्र है। कीबोर्ड से प्रवेश करने के लिए यह बहुत कठिन (असंभव?) है और यह तार्किक अर्थ बनाता है।

\ n कुछ संदर्भों में एक और अच्छा उम्मीदवार है।

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

+0

क्या यह ex.message ग्रंथों में समाप्त हो सकता है? –

+0

इस पर निर्भर करता है कि कौन अपवाद फेंकता है। \ n वास्तव में हो सकता है। लेकिन आप कुछ दुर्लभ यूनिकोड चरित्र का उपयोग कर सकते हैं! –

2

मैं व्यक्तिगत रूप से कहूंगा कि यह पूरी तरह से स्थिति पर निर्भर करता है; यदि आप एक साधारण टीसीपी/आईपी चैट सिस्टम लिख रहे हैं, तो आपको स्पष्ट रूप से विभाजन के रूप में '\ n' का उपयोग नहीं करना चाहिए .. लेकिन '\ 0' इस तथ्य के कारण उपयोग करने के लिए एक अच्छा चरित्र है कि उपयोगकर्ता कभी नहीं कर सकते इसका इस्तेमाल करें!

5

यह निर्भर करता है कि आप क्या विभाजित कर रहे हैं।कुंजी; | मूल्य | मूल्य

कुंजी = मान

ज्यादातर मामलों में यह, विभाजन वर्ण कि काफी अधिक इस्तेमाल किया जाता है का उपयोग करने के उदाहरण के लिए

मूल्य, मूल्य, मूल्य

मूल्य सबसे अच्छा है = मूल्य;

कुंजी: मान; कुंजी: मान;

आप अल्पविरामों के साथ अच्छी तरह से उद्धृत पहचानकर्ता का उपयोग कर सकते हैं:

"मूल्य", "मूल्य", "के साथ मूल्य, अंदर", "मूल्य"

मैं , का उपयोग करते हैं सबसे पहले, तो |, तो अगर मैं उनमें से किसी का उपयोग नहीं कर सकता तो मैं सेक्शन ब्रेक चार §

नोट करें कि आपके साथ कोई ASCII char टाइप कर सकते हैं(संख्यात्मक कीपैड पर केवल), इसलिए §ALT+21

19
0x0 के अलावा

है, जो उपलब्ध नहीं हो सकता है (क्योंकि अशक्त-समाप्त तार, उदाहरण के लिए की), 0x1 और 0x1f के बीच ASCII नियंत्रण वर्ण अच्छा उम्मीदवार हैं। 0x1c-0x1f ASCII वर्ण भी ऐसी बात के लिए तैयार किया गया है और नाम फ़ाइल सेपरेटर, समूह सेपरेटर, रिकार्ड सेपरेटर, यूनिट सेपरेटर है कर रहे हैं। हालांकि, उन्हें XML जैसे परिवहन प्रारूपों में वर्जित किया गया है।

उस स्थिति में, के पात्रों का उपयोग किया जा सकता है।

एक आखिरी विकल्प एक बचने की रणनीति का उपयोग करना होगा, ताकि अलगाव चरित्र किसी भी तरह से प्रवेश किया जा सके। हालांकि, यह कार्य को काफी जटिल करता है और आप स्ट्रिंग का उपयोग नहीं कर सकते हैं। अब और पढ़ें।

+1

ध्यान दें कि 0x1 और 0x1f 'के बीच के अधिकांश नियंत्रण वर्ण XML क्रमिक नहीं हैं। – wqw

2

सबसे पहले, सी # (या .NET) में, आप एक स्प्लिट ऑपरेशन में एक से अधिक स्प्लिट वर्णों का उपयोग कर सकते हैं।

String.Split Method (Char[])Reference here
यूनिकोड वर्ण कि इस उदाहरण, एक खाली सरणी है कि कोई सीमांकक, या नल संदर्भ (विजुअल बेसिक में कुछ भी) शामिल हैं में सबस्ट्रिंग परिसीमित की एक सरणी।

मेरी राय में, वहाँ कोई सबसे विश्वसनीय विभाजन चरित्र है, लेकिन कुछ अन्य लोगों की तुलना में अधिक उपयुक्त हैं।

टैब, कॉमा, पाइप जैसे लोकप्रिय विभाजित वर्ण अन-विभाजित स्ट्रिंग/लाइन को देखने के लिए अच्छे हैं।

यदि यह केवल भंडारण/प्रसंस्करण के लिए है, तो सुरक्षित वर्ण शायद वे हैं जिन्हें कभी-कभी उपयोग नहीं किया जाता है या जिन्हें कीबोर्ड से आसानी से दर्ज नहीं किया जाता है।

यह उपयोग संदर्भ पर भी निर्भर करता है। जैसे यदि आप डेटा को ईमेल पते रखने की अपेक्षा कर रहे हैं, तो "@" कोई संख्या नहीं है।

कहते हैं कि हम ASCII set से एक चुनने थे। से चुनने के लिए काफी संख्या है। जैसे "` ","^"और कुछ गैर-प्रिंट करने योग्य पात्र। हालांकि कुछ पात्रों से सावधान रहें, सभी उपयुक्त नहीं हैं। जैसे 0x00 का कुछ सिस्टम पर प्रतिकूल प्रभाव हो सकता है।

0

"|" जब आप तर्क पारित कर रहे होते हैं तो पाइप साइन का उपयोग आमतौर पर एक स्ट्रिंग प्रकार पैरामीटर को स्वीकार करने की विधि के लिए किया जाता है। इसका व्यापक रूप से SQL सर्वर एसपी में उपयोग किया जाता है, जहां आपको पैरामीटर के रूप में सरणी को पास करने की आवश्यकता होती है। वैसे ज्यादातर यह उस स्थिति पर निर्भर करता है जहां आपको इसकी आवश्यकता होती है।

15

यदि आप स्ट्रिंग से बचते हैं तो आप सुरक्षित रूप से जो भी चरित्र पसंद करते हैं उसका उपयोग कर सकते हैं ताकि आप जानते हों कि इसमें वह चरित्र नहीं है।

आइए उदाहरण के लिए चरित्र 'एक' के रूप में सीमांकक चुनें। (मैं जानबूझकर पता चलता है कि किसी भी चरित्र इस्तेमाल किया जा सकता एक सामान्य चरित्र उठाया।)

भागने कोड के रूप में चरित्र 'बी' का प्रयोग करें।

private static string Escape(string s) { 
    return s.Replace("b", "b2").Replace("a", "b1"); 
} 

अब, स्ट्रिंग किसी भी 'एक' वर्ण नहीं है, तो आप कई डाल सकते हैं: हम में से 'एक' के साथ 'बी 1' किसी भी घटना और 'बी 2' के साथ 'बी' के किसी भी घटना की जगह एक साथ उन तार की:

string msg = Escape("banana") + "a" + Escape("aardvark") + "a" + Escape("bark"); 

स्ट्रिंग अब इस तरह दिखता है:

b2b1nb1nb1ab1b1rdvb1rkab2b1rk 

अब आप 'एक' पर स्ट्रिंग विभाजित कर सकते हैं और मिल अलग अलग हिस्सों:

+०१२३५१६४१०६१

private static string Unescape(string s) { 
    return s.Replace("b1", "a").Replace("b2", "b"); 
} 

तो स्ट्रिंग बंटवारे और भागों unencoding इस तरह से किया जाता है:

string[] parts = msg.split('a'); 
for (int i = 0; i < parts.length; i++) { 
    parts[i] = Unescape(parts[i]); 
} 

या इसका उपयोग करते LINQ:

b2b1nb1nb1 
b1b1rdvb1rk 
b2b1rk 

भागों आप प्रतिस्थापन पीछे की ओर कर डिकोड करने के लिए

आप परिसीमक के रूप में एक कम आम चरित्र चुनते हैं, तो निश्चित रूप से कम घटनाओं रहे हैं वह बच जाएगा। मुद्दा यह है कि विधि यह सुनिश्चित करती है कि चरित्र को उस डेटा में मौजूद वर्णों के बारे में कोई धारणा नहीं है, जिसे आप स्ट्रिंग में रखना चाहते हैं, इस बारे में कोई धारणा के बिना कैलिमीटर के रूप में उपयोग करना सुरक्षित है।

+1

समस्या जो मैं इस विधि के साथ देखता हूं, आइए कहें कि आपकी स्ट्रिंग में मूल स्ट्रिंग में बी 1 शामिल है उदाहरण के लिए "प्वाइंट बी 1: एक सेब", अब आपके पास "पॉइंट बी 1: बी 1 एन बी 1pple" भागने के बाद होगा, अब जब आप अनचेक करेंगे "एक बिंदु: एक सेब" है - तो यह पूरी तरह से आपकी विधि को नष्ट कर देता है। पहले भी एक अस्पष्ट चरित्र के साथ शुरू हो सकता है, आपको नहीं लगता? –

+6

@ जेएल: आप गलत हैं। स्ट्रिंग से बचने के बाद "बिंदु बी 21: बी 1 एन बी 1pple" है। इसे अनदेखा करने से मूल स्ट्रिंग मिलती है। एक सामान्य चरित्र चुनने का कारण यह साबित करना है कि विधि पूरी तरह से सुरक्षित है। आम तौर पर आप बचने की जरूरत वाले पात्रों की संख्या को कम करने के लिए कम इस्तेमाल किए गए चरित्र का चयन करेंगे। – Guffa

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