10

String.Normalize()在 .NET 中,您可以使用 枚举来规范化(NFC、NFD、NFKC、NFKD)字符串Text.NormalizationForm

在 .NET for Windows Store Apps 中,两者都不可用。我查看了String类和System.TextandSystem.Globalization命名空间,但什么也没找到。

我错过了什么吗?如何规范化 Windows 应用商店应用程序中的字符串?

有谁知道为什么该Normalize方法不适用于商店应用程序?

4

2 回答 2

7

正如您所指出的,该Normalize方法在 Windows 商店应用程序的String中不可用。

但是,这只是调用Windows API 中的NormalizeString函数

更好的是,这个函数在 Windows 应用商店应用程序中可用的 Win32 和 COM API 函数的批准列表中

也就是说,您将做出以下声明:

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();
于 2013-03-06T20:24:10.187 回答
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);
于 2015-01-07T08:16:29.523 回答