10

在.NET中,您可以使用String.Normalize()來標準化(NFC,NFD,NFKC,NFKD)字符串,並且存在Text.NormalizationForm枚舉。如何規範一個字符串?

在用於Windows應用商店應用的.NET中,兩者都不可用。我查看了String類和System.TextSystem.Globalization名稱空間,但沒有發現任何內容。

我錯過了什麼嗎?如何正常化Windows Store應用中的字符串?

有沒有人知道爲什麼Normalize方法不適用於商店應用程序?

+3

'字符串正常工作的唯一途徑.Normalize'依賴於normaliz.dll中內置的本地函數。我挖了一下,發現它使用[NormalizeString](http://msdn.microsoft.com/en-us/library/windows/desktop/dd319093(v = vs.85).aspx)函數。由於它特定於Windows,因此它不適用於Windows應用商店應用。不幸的是,我對替代品毫無所知。 – 2013-02-10 15:35:02

+1

@AlexanderManekovskiy你錯了,[NormalizeString'在Win32和COM API函數的批准列表中可用於Windows應用商店應用程序](http://msdn.microsoft.com/en-us/library/windows/apps/hh452772 )。 – casperOne 2013-03-08 12:20:20

+0

@casperOne哇,我的眼睛在哪裏?!感謝您指出此列表。 – 2013-03-08 14:36:45

回答

7

正如您所指出的那樣,Normalize method不適用於Windows商店應用程序上的String class

但是,這只是在Windows API中調用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

'StringBuffer lpDstString'是否正確,或者你的意思是'StringBuilder'? – 2013-03-08 10:01:59

+1

我想讓它工作(使用'StringBuilder'而不是'StringBuffer',其中AFAIK不存在),但它不起作用。 'buffer'總是「空」(只包含一堆'\ 0')。任何想法是什麼造成這個? – 2013-03-08 10:29:13

+0

@SebastianNegraszus'StringBuffer'是一個錯誤,它應該是'StringBuilder'。你是否檢查'NormalizeString'和'Marhsal.GetLastWin32Error'值的返回值?如果出現問題,他們會給你更多的信息。 – casperOne 2013-03-08 12:19:35

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); 
相關問題