2012-02-06 18 views
22

अपडेट किया गया प्रश्नयूनिकोड का कौन सा संस्करण समर्थित है जिसके द्वारा .NET प्लेटफॉर्म और चरित्र वर्गों के संबंध में विंडोज के किस संस्करण पर समर्थित है?

¹ के साथ चरित्र वर्गों, तुलना, छंटाई, सामान्य और collations, के संबंध क्या यूनिकोड संस्करण या संस्करण जो .NET प्लेटफार्मों द्वारा समर्थित हैं?

मूल प्रश्न

मैं कुछ हद तक अस्पष्ट पढ़ जो .NET यूनिकोड संस्करण 3.0 का समर्थन किया और आंतरिक UTF-16 एन्कोडिंग वास्तव में UTF-16 नहीं है कि याद है, लेकिन वास्तव यूसीएस -2 का उपयोग करता है, जो नहीं है वही। यह उदाहरण के लिए लगता है, यह है कि इसके बाद के संस्करण U + FFFF वर्ण अर्थात विचार करते हैं, संभव नहीं हैं:

string s = "\u1D7D9"; // ("Mathematical double-struck digit one") 

और यह स्ट्रिंग "ᵽ9" संग्रहीत करता है।

मैं मूल रूप से निम्नलिखित के लिए जवाब की निश्चित संदर्भ के लिए देख रहा हूँ:

  • यदि ऐसा नहीं है सच UTF-16 .NET में, यह क्या है?
  • यूनिकोड का कौन सा संस्करण .NET द्वारा समर्थित है?
  • हाल के संस्करण समर्थित नहीं कर रहे हैं या निकट भविष्य में योजना बनाई है, किसी को भी एक (गैर) वाणिज्यिक पुस्तकालय के बारे में पता है या कैसे मैं इस मुद्दे को वैकल्पिक हल कर सकते हैं?

¹) मैं समय गुजर के साथ के रूप में सवाल अद्यतन, यह उत्तर देने के लिए और बड़े समुदाय के संबंध में अधिक उपयुक्त लगता है। मैंने मूल प्रश्न छोड़ दिया है कि टिप्पणियों में किस भागों का उत्तर दिया गया है। इसके अलावा पुराने यूसीएस -2 (कोई सरोगेट्स) का उपयोग अब-प्राचीन 32 बिट विंडोज संस्करणों में नहीं किया गया था, .NET ने हमेशा यूटीएफ -16 (सरोगेट्स के साथ) आंतरिक रूप से उपयोग किया है।

+1

आप उन पात्रों के साथ क्या करने की कोशिश कर रहे हैं? उन्हें एएसपी.नेट के साथ एक वेबपेज में रखें? उन्हें एक WPF या WinForms इंटरफ़ेस में प्रदर्शित करें? –

+2

इस संदर्भ में "यह काम नहीं करता" मतलब क्या है? – Gabe

+0

@ जोसट्रॉमैन: हम एक नए एक्सएमएल-आधारित डेटा ट्रांसफॉर्मेशन टूलसेट को कार्यान्वित कर रहे हैं, और मैं यह पता लगाने की कोशिश कर रहा हूं कि मैं कह सकता हूं कि "हम यूनिकोड को 6.0 तक समर्थन करते हैं" या फिर हमें कुछ और कहना चाहिए। इसके अलावा, मैं यह पता लगाने की कोशिश कर रहा हूं कि हम .NET में संभावित सीमाओं को कैसे बाधित कर सकते हैं। – Abel

उत्तर

16

आंतरिक रूप से, .NET यूटीएफ -16 है। कुछ मामलों में, उदा। जब एएसपी.नेट प्रतिक्रिया को लिखता है, डिफ़ॉल्ट रूप से यह यूटीएफ -8 का उपयोग करता है। वे दोनों उच्च विमानों को संभाल सकते हैं।

कारण लोग कभी-कभी नेट का उल्लेख के रूप में UCS2 है (मैं लगता , क्योंकि मैं कुछ अन्य कारणों से देखें) कि चार सख्ती से है 16 बिट और एक भी चार ऊपरी विमानों का प्रतिनिधित्व करने के लिए नहीं किया जा सकता है। चार, हालांकि, स्थिर विधि अधिभार (उदा। Char.IsLetter) है जो एक स्ट्रिंग के अंदर उच्च विमान यूटीएफ -16 अक्षरों पर काम कर सकता है। स्ट्रिंग्स को वास्तविक यूटीएफ -16 के रूप में संग्रहीत किया जाता है।

आप उच्च यूनिकोड कोडपॉइंट्स को सीधे अपरकेस \U का उपयोग कर संबोधित कर सकते हैं - उदा। "\U0001D7D9" - लेकिन फिर, केवल तारों के अंदर, वर्ण नहीं।

यूनिकोड संस्करण के लिए के रूप में, from the MSDN documentation:

".NET फ्रेमवर्क 4 में, छँटाई, आवरण, सामान्य, और यूनिकोड वर्ण जानकारी विंडोज 7 के साथ सिंक्रनाइज़ और यूनिकोड 5.1 मानक के अनुरूप है।"

अद्यतन 1: यह ध्यान देने योग्य है, तथापि, कि इस संकेत नहीं करता है लायक है कि संपूर्णता यूनिकोड 5.1 की समर्थित है - विंडोज 7 में है और न ही .NET 4.0

Windows 8 targets Unicode 6.0 में न - मैं कर रहा हूँ अनुमान लगाया जा रहा है कि .NET Framework 4.5 इसके साथ सिंक्रनाइज़ हो सकता है, लेकिन इसे पुष्टि करने वाले कोई स्रोत नहीं मिला है। और एक बार फिर, इसका मतलब यह नहीं है कि पूरा मानक लागू किया गया है।

अद्यतन 2:This note on Roslyn पुष्टि करता है कि अंतर्निहित मंच संकलक के लिए यूनिकोड का समर्थन परिभाषित करता है, और link to the code में यह बताते हैं कि सी # 6.0 यूनिकोड 6.0 और (एक परिणाम के रूप सी # पहचानकर्ता के लिए एक को तोड़ने परिवर्तन के साथ) का समर्थन करता है।

अद्यतन 3: नेट संस्करण 4.5 एक new class SortVersion के बाद से स्थिर संपत्ति SortVersion.FullVersion बुला द्वारा समर्थित यूनिकोड संस्करण प्राप्त करने के लिए शुरू किया गया है। the same page पर, माइक्रोसॉफ्ट बताता है कि .NET 4.0 सभी प्लेटफार्मों पर यूनिकोड 5.0 का समर्थन करता है और .NET 4.5 विंडोज 7 पर यूनिकोड 5.0 और विंडोज 8 पर यूनिकोड 6.0 का समर्थन करता है। यह थोड़ा सा विपरीत the official "what is new" statement here है, जो क्रमशः संस्करण 5.x और 6.0 की वार्तालाप करता है। मेरे अपने (संपादक: हाबेल) अनुभव से, ज्यादातर मामलों में ऐसा लगता है कि .NET 4.0 में, यूनिकोड 5.1 कम से कम चरित्र वर्गों के लिए समर्थित है, लेकिन मैंने सॉर्टिंग, सामान्यीकरण और collations का परीक्षण नहीं किया। यह ऊपर उद्धृत के रूप में MSDN में कहा गया है के साथ लाइन में लगता है।

+1

'char' के बारे में अच्छा अवलोकन। मुझे वास्तव में पता है कि 'char uni = "\ U0002B740"। ToCharArray() [0];' 55405 "दिखाता है, जो यूटीएफ -16 सरोगेट जोड़ी का केवल एक आधा है। यह आपके संदर्भ से चलता है कि '\ u0526' (गलत तरीके से) पर Char.IsLetter को' झूठा 'दिखाता है, क्योंकि इसे केवल यूनिकोड 6 के साथ पेश किया गया था। – Abel

+1

(इसे स्वीकार कर रहा है क्योंकि आपने उस संदर्भ को दिखाया जिसे मैं ढूंढ रहा था और खोजने के लिए बहुत बेवकूफ स्पष्ट स्थान पर, हालांकि, अन्य उत्तर अपने दायरे में मूल्यवान हैं) – Abel

+1

यह एकल वर्णों के लिए जानकारी प्राप्त करने के लिए मूल का एक सहायक बिंदु हो सकता है: [एमएसडीएन लिंक] (http://msdn.microsoft.com/en- हमें/पुस्तकालय/system.globalization.stringinfo.aspx)। चूंकि चार में एक से अधिक आधा नहीं हो सकता है, इसलिए स्ट्रिंगइन्फो विधियां इसके बजाय एक स्ट्रिंग लौटाती हैं, पूर्ण यूटीएफ -16 जोड़ी (यदि चरित्र * एक जोड़ी है - अन्यथा यह केवल एक char - एक स्ट्रिंग, या कैरेक्टर + संयोजन के रूप में देता है diacritics संयोजन के लिए पात्र)। – JimmiTh

4

MSDN यह संक्षिप्त यहां शामिल किया गया है: http://msdn.microsoft.com/en-us/library/9b1s4yhz(v=vs.90).aspx

मैं इस कोशिश की:

static void Main(string[] args) { 
     string someText = char.ConvertFromUtf32(0x1D7D9); 
     using (var stream = new MemoryStream()) { 
      using (var writer = new StreamWriter(stream, Encoding.UTF32)) { 
       writer.Write(someText); 
       writer.Flush(); 
      } 
      var bytes = stream.ToArray(); 
      foreach (var oneByte in bytes) { 
       Console.WriteLine(oneByte.ToString("x")); 
      } 
     } 
    } 

और एक सही बीओएम और \ u1D7D9 कोडपॉइंट का सही प्रतिनिधित्व युक्त एक बाइट सरणी के एक डंप है,

  • UTF8
  • UTF: इन एनकोडिंग के लिए 32
  • यूनिकोड (UTF-16)

तो मेरा अनुमान है कि उच्च विमानों का समर्थन कर रहे है, और कहा कि UTF-16 वास्तव में UTF-16 (और नहीं यूसीएस-2)

+0

एक आसान दृष्टिकोण दिखाने के लिए धन्यवाद। ऐसा लगता है कि वास्तव में यूटीएफ -16 है और यूसीएस -2 नहीं (अब और?)। चरित्र और उसके सभी एन्कोडिंग यहां हैं: http://www.fileformat.info/info/unicode/char/1d7d9/index.htm – Abel

+0

बीटीडब्ल्यू, मैंने उस संदर्भ को पढ़ा लेकिन मुझे इस बारे में निश्चित जानकारी नहीं मिली कि किस संस्करण का समर्थन किया गया था यूनिकोड। – Abel

5
है

वह चरित्र समर्थित है।

string text = "\U0001D7D9"

आप एक में है कि चरित्र के साथ एक WPF अनुप्रयोग बनाते हैं: नोट करने के लिए एक बात है कि अधिक से अधिक 2 बाइट्स के साथ यूनिकोड वर्ण के लिए, आप उन्हें एक अपरकेस '\ यू' के साथ, की घोषणा करनी चाहिए इस तरह है टेक्स्ट ब्लॉक, इसे डबल-वन कैरेक्टर को पूरी तरह से प्रस्तुत करना चाहिए।

+1

एक और बात: http://msdn.microsoft.com/en-us/library/aa664669(v=vs.71).aspx को एक स्ट्रिंग में 2-बाइट वर्णों का प्रतिनिधित्व करने के विवरण के लिए पढ़ें। –

0
.NET फ्रेमवर्क 4.6

और 4.5 और 4 और 3.5 और 3.0 - यूनिकोड स्टैंडर्ड, संस्करण 5.0 .NET फ्रेमवर्क 2.0 और 1.1 - यूनिकोड स्टैंडर्ड, संस्करण 3.1

पूरा जवाब पाया जा सकता है here अनुभाग टिप्पणियों के तहत।

+0

मूल उत्तर में किए गए संपादन देखें, यह उतना नहीं है जितना कि एमएसडीएन पृष्ठ सुझाव देता है। असल में, वह पृष्ठ केवल यूनिकोड चरित्र श्रेणियों के बारे में बात करता है, जो वर्ण एन्कोडिंग या समर्थित चरित्र श्रेणियों के संबंध में समान नहीं है, लेकिन यह ढांचे के संस्करण और अंतर्निहित ऑपरेटिंग सिस्टम के बीच भी अलग हैं। अधिक जानकारी के लिए [सॉर्टवर्सन पर एमएसडीएन लेख] देखें (https://msdn.microsoft.com/en-us/library/system.globalization.sortversion%28v=vs.110%29.aspx) (लेकिन चेतावनी दी जानी चाहिए, यहां तक ​​कि चेतावनी भी दी जाएगी वह पृष्ठ पूरा नहीं हुआ है)। – Abel