10

In .NET können Sie (NFC, NFD, NFKC, NFKD) Strings mit String.Normalize() normalisieren und es gibt eine Text.NormalizationForm enum.Wie normalisiere ich eine Zeichenfolge?

In .NET für Windows Store Apps sind beide nicht verfügbar. Ich habe in der String Klasse und in den System.Text und System.Globalization Namespaces geschaut, aber nichts gefunden.

Habe ich etwas verpasst? Wie normalisiere ich Zeichenfolgen in Windows Store Apps?

Hat jemand eine Idee, warum die Methode Normalize nicht für Store Apps zur Verfügung gestellt wurde?

+3

'String .Normalize' basiert auf nativen Funktionen, die in normaliz.dll erstellt wurden. Ich grub ein bisschen und fand, dass es [NormalizeString] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd319093 (v = vs.85) .aspx) -Funktion verwendet. Da es für Windows spezifisch ist, ist es nicht für Windows Store Apps verfügbar. Leider habe ich kein Wissen über Alternativen. –

+1

@AlexanderManekovskiy Sie haben sich geirrt, ['NormalizeString' ist in der Liste der zugelassenen Win32- und COM-API-Funktionen in Windows Store-Apps enthalten] (http://msdn.microsoft.com/en-us/library/windows/apps/hh452772). – casperOne

+0

@casperOne Wow, wo waren meine Augen ?! Danke, dass Sie auf diese Liste zeigen. –

Antwort

7

Wie Sie darauf hingewiesen haben, ist die Normalize method nicht in den String class Windows Store-Apps verfügbar.

Allerdings ruft dies nur die NormalizeString function in der Windows-API.

Noch besser ist diese Funktion in the approved list of Win32 and COM API functions usable in Windows Store apps.

Das heißt, würden Sie die folgenden Erklärungen abgeben:

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); 

Sie würden es dann rufen Sie wie folgt:

// 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

Ist 'StringBuffer lpDstString' korrekt oder meintest du 'StringBuilder'? –

+1

Ich versuche, es funktioniert zu bekommen (mit 'StringBuilder' statt' StringBuffer', die AFAIK nicht existiert), aber es funktioniert nicht. 'buffer'ist immer" leer "(enthält nichts als eine Menge' \ 0'). Irgendeine Idee, was das verursacht? –

+0

@SebastianNegraszus 'StringBuffer' war ein Fehler, es sollte' StringBuilder' sein. Überprüfen Sie den Rückgabewert von 'NormalizeString' und den' Marhsal.GetLastWin32Error' Werten? Sie geben Ihnen mehr Einblick, wenn etwas schief läuft. – casperOne

0

Hallo dies ist mein Arbeits Code, ich brauche nicht um die Zeichenkettenabbruchzeichen zu trimmen, da keine vorhanden sind, aber ich mache das nur für den Fall.

Durch die Verwendung von -1 anstelle einer bestimmten Länge ich im Stich gelassen werde es automatisch das String-Terminator finden und dies ist die einzige Art, wie ich es in einem WinRT/WinPhoneRT Plattform Ziel richtig arbeiten konnte

 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); 
Verwandte Themen