Как нормализовать строку?

В .NET вы можете нормализовать строки (NFC, NFD, NFKC, NFKD) с String.Normalize() и есть Text.NormalizationForm enum.

В приложениях .NET для Windows Store оба они недоступны. Я просмотрел класс String и в пространствах имен System.Text и System.Globalization, но ничего не нашел.

Я что-то пропустил? Как нормализовать строки в приложениях Windows Store?

У кого-нибудь есть идея, почему метод Normalize не был доступен для Store Apps?

Ответ 1

Как вы указали, метод Normalize не доступен на String class в приложениях магазина Windows.

Однако это просто вызывает функцию NormalizeString в Windows API.

Еще лучше, эта функция находится в одобренном списке функций Win32 и COM API, которые можно использовать в приложениях Windows Store.

Тем не менее, вы сделали бы следующие объявления:

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

Ответ 2

Здравствуйте, это мой рабочий код, мне не нужно обрезать символы окончания строки, поскольку их нет, но я делаю это на всякий случай.

Используя -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);