10

.NET では、(NFC、NFD、NFKC、NFKD) 文字列を正規化でき、列挙型String.Normalize()があり ます。Text.NormalizationForm

.NET for Windows Store Apps では、両方を利用できません。StringクラスとSystem.Text名前System.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 に答える