10

.NET에서 String.Normalize()으로 (NFC, NFD, NFKC, NFKD) 문자열을 정규화 할 수 있으며 Text.NormalizationForm 열거 형이 있습니다.문자열을 정규화하려면 어떻게합니까?

Windows 스토어 앱용 .NET에서는 둘 모두 사용할 수 없습니다. String 클래스와 System.TextSystem.Globalization 네임 스페이스를 살펴 보았지만 아무 것도 발견되지 않았습니다.

내가 놓친 것이 있습니까? Windows Store 응용 프로그램에서 문자열을 정규화하려면 어떻게합니까?

스토어 앱용으로 Normalize 메서드를 사용할 수없는 이유는 누구입니까?

+3

'문자열에서 제대로 작동하려면 얻을 수있는 유일한 방법입니다 .Normalize'는 normaliz.dll에 내장 된 네이티브 함수에 의존합니다. 나는 조금 파고 그것 [NormalizeString] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd319093 (v = vs.85) .aspx) 함수를 사용하는 것으로 나타났습니다. Windows 전용이므로 Windows Store 응용 프로그램에서는 사용할 수 없습니다. 불행히도 대안에 대한 지식이 없습니다. –

+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'는 항상 "empty"입니다 (단지'\ 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);