10

.NET में आप String.Normalize() के साथ सामान्य (एनएफसी, एनएफडी, एनएफकेसी, एनएफकेडी) तारों को सामान्यीकृत कर सकते हैं और Text.NormalizationForm enum है।मैं स्ट्रिंग को सामान्य कैसे बना सकता हूं?

विंडोज स्टोर ऐप्स के लिए .NET में, दोनों उपलब्ध नहीं हैं। मैंने String वर्ग और System.Text और System.Globalization नामस्थानों में देखा है, लेकिन कुछ भी नहीं मिला है।

क्या मुझे कुछ याद आया है? मैं विंडोज स्टोर ऐप में तारों को सामान्य कैसे करूं?

क्या किसी को पता है कि स्टोर ऐप्स के लिए Normalize विधि क्यों उपलब्ध नहीं थी?

+3

'स्ट्रिंग में ठीक से काम करने मिल सकता है Normalize' normaliz.dll में बनाए गए मूल कार्यों पर निर्भर करता है। मैंने थोड़ा खोला और पाया कि यह [NormalizeString] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd319093 (v = vs.85) .aspx) फ़ंक्शन का उपयोग करता है। चूंकि यह विंडोज के लिए विशिष्ट है क्योंकि यह विंडोज स्टोर ऐप के लिए उपलब्ध नहीं है। दुर्भाग्य से, मुझे विकल्पों के बारे में कोई जानकारी नहीं है। –

+1

@AlexanderManekovskiy आप गलत हैं, ['NormalizeString' Win32 और COM API फ़ंक्शन की अनुमोदित सूची पर है जो Windows Store ऐप्स में प्रयोग योग्य है] (http://msdn.microsoft.com/en-us/library/windows/apps/hh452772)। – casperOne

+0

@ कैस्परऑन वाह, मेरी आँखें कहाँ थीं ?! इस सूची पर इंगित करने के लिए धन्यवाद। –

उत्तर

7

जैसा कि आपने बताया है, Normalize method विंडोज स्टोर ऐप्स पर String class पर उपलब्ध नहीं है।

हालांकि, यह विंडोज एपीआई में NormalizeString function पर कॉल करता है।

इससे भी बेहतर, यह फ़ंक्शन the approved list of Win32 and COM API functions usable in Windows Store apps में है।

जिसके अनुसार, आप निम्नलिखित घोषणाओं बनाने चाहते हैं:

public enum NORM_FORM 
{ 
    NormalizationOther = 0, 
    NormalizationC  = 0x1, 
    NormalizationD  = 0x2, 
    NormalizationKC  = 0x5, 
    NormalizationKD  = 0x6 
}; 

[DllImport("Normaliz.dll", CharSet = CharSet.Unicode, ExactSpelling = true, 
    SetLastError = true) 
public static extern int NormalizeString(NORM_FORM NormForm, 
    string lpSrcString, 
    int cwSrcLength, 
    StringBuilder lpDstString, 
    int cwDstLength); 

फिर आप तो जैसे इसे कहते हैं:

// The form. 
NORM_FORM form = ...; 

// String to normalize. 
string unnormalized = "..."; 

// Get the buffer required. 
int bufferSize = 
    NormalizeString(form, unnormalized, unnormalized.Length, null, 0); 

// Allocate the buffer. 
var buffer = new StringBuilder(bufferSize); 

// Normalize. 
NormalizeString(form, unnormalized, unnormalized.Length, buffer, buffer.Length); 

// Check for and act on errors if you want. 
int error = Marshal.GetLastWin32Error(); 
+0

क्या 'स्ट्रिंगबफर एलपीडीस्टस्ट्रिंग' सही है, या क्या आपका मतलब 'स्ट्रिंगबिल्डर' था? –

+1

मैं इसे काम करने की कोशिश कर रहा हूं ('स्ट्रिंगबफर' के बजाय 'स्ट्रिंगबिल्डर' का उपयोग करके, जो AFAIK मौजूद नहीं है), लेकिन यह काम नहीं करता है। 'बफर' हमेशा "खाली" होता है (इसमें कुछ भी नहीं है लेकिन '\ 0' का समूह है)। कोई विचार यह क्या कर रहा है? –

+0

@ सेबेस्टियन नेग्रसज़स 'स्ट्रिंगबफर' एक त्रुटि थी, इसे 'स्ट्रिंगबिल्डर' माना जाता है। क्या आप 'NormalizeString' और' Marhsal.GetLastWin32Error' मानों से वापसी मान की जांच कर रहे हैं? कुछ गलत होने पर वे आपको अधिक अंतर्दृष्टि देंगे। – casperOne

0

हैलो यह मेरा काम कर कोड, मैं की आवश्यकता नहीं है स्ट्रिंग टर्मिनेशन अक्षरों को ट्रिम करने के लिए क्योंकि कोई भी मौजूद नहीं है लेकिन मैं बस ऐसा कर रहा हूं।

का उपयोग कर -1 एक निर्दिष्ट लंबाई मैं इसे ऑटो को खोजने स्ट्रिंग टर्मिनेटर दे रहा हूँ के बजाय धीरे-धीरे यह एक ही तरीका है कि मैं इसे एक WinRT/WinPhoneRT मंच लक्ष्य

 int bufferSize = NormalizeString(Globals.NORM_FORM.NormalizationKD, toNormalise, -1, null, 0); 

     StringBuilder buffer = new StringBuilder(bufferSize); 

     // Normalize. 
     NormalizeString(Globals.NORM_FORM.NormalizationKD, toNormalise, -1, buffer, buffer.Capacity); 

     // Check for and act on errors if you want. 
     int error = Marshal.GetLastWin32Error(); 

     if(error !=0) 
     { 
      throw (new Exception("A Win32 error with code " + error + " has occured in unmanaged NormalizeString")); 
     } 
     char[] trim = {'\0'}; 

     return buffer.ToString().TrimEnd(trim);