10

.NETでは(NFC、NFD、NFKC、NFKD)の文字列をString.Normalize()で正規化でき、Text.NormalizationForm列挙型があります。文字列を正規化するにはどうすればよいですか?

Windowsストアアプリの.NETでは、どちらも利用できません。私はStringクラスとSystem.TextSystem.Globalization名前空間を調べましたが、何も見つかりませんでした。

私は何かを見逃しましたか? Windowsストアアプリで文字列を正規化するにはどうすればよいですか?

Normalizeメソッドがストアアプリで使用できない理由が分かりますか?

+3

'文字列で正しく動作するために得ることができる唯一の方法であります.Normalize'は、normaliz.dllに組み込まれているネイティブ関数に依存します。私はちょっと掘り、[NormalizeString](http://msdn.microsoft.com/en-us/library/windows/desktop/dd319093(v = vs.85).aspx)関数を使用していることを発見しました。 Windows固有のものなので、Windowsストアアプリでは使用できません。不幸にも、私は選択肢について知識がありません。 –

+1

@AlexanderManekovskiyあなたは間違っています、['NormalizeString'はWindows Storeアプリケーションで使用可能なWin32およびCOM API関数の承認済みリストにあります](http://msdn.microsoft.com/en-us/library/windows/apps/hh452772) )。 – casperOne

+0

@casperOneうわー、私の目はどこですか?このリストをご指摘いただきありがとうございます。 –

答えて

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'を意味しましたか? –

+1

私はそれを(AFAIKは存在しない 'StringBuffer'の代わりに' StringBuilder'を使って)動作させようとしていますが、動作しません。 'buffer'は常に"空 "です(' \ 0'の束を含んでいます)。これを引き起こす原因は何ですか? –

+0

@SebastianNegraszus 'StringBuffer'はエラーで、' StringBuilder'となっています。あなたは 'NormalizeString'と' Marhsal.GetLastWin32Error'の値から戻り値をチェックしていますか?何かが間違っている場合、彼らはあなたにもっと多くの洞察を与えます。 – casperOne

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); 
関連する問題