在.NET中,您可以使用String.Normalize()
标准化(NFC,NFD,NFKC,NFKD)字符串,并且有一个Text.NormalizationForm
枚举。
在.NET for Windows商店应用程序中,两者都不可用。我查看过String
类以及System.Text
和System.Globalization
命名空间,但一无所获。
我错过了什么吗?如何规范化Windows应用商店应用中的字符串?
有没有人知道为什么Normalize
方法无法用于商店应用?
答案 0 :(得分:7)
正如您所指出的,Windows商店应用上的Normalize
method无法使用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();
答案 1 :(得分: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);