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); 
相关问题