2011-02-07 5 views
16

오늘이 문제에 직면하고 문화에 따라이 테스트가 실패하는 이유에 대해 누군가 알고 있는지 궁금합니다. 목표는 테스트 텍스트가 서로 옆에 두 개의 공백을 포함하는지 확인하는 것입니다.이 공백은 string.IndexOf에 따라 수행됩니다 (문자열이 서로 인접한 두 공백을 모두 바꾸도록 지정하더라도). 몇 가지 테스트를 마치면 \xAD이 어떻게 든이 문제를 일으키는 것으로 보입니다.string IndexOf and Replace

public class ReplaceIndexOfSymmetryTest 
{ 
    [Test] 
    public void IndexOfShouldNotFindReplacedString() 
    { 
     string testText = "\x61\x20\xAD\x20\x62"; 
     const string TWO_SPACES = " "; 
     const string ONE_SPACE = " "; 
     string result = testText.Replace(TWO_SPACES, ONE_SPACE); 
     Assert.IsTrue(result.IndexOf(TWO_SPACES) < 0); 
    } 
} 
+0

이 문제가 될지 확실하지 않지만이 테스트에서 서로 공백이 있으면 3 번 끝에 서로 겹치게됩니다. –

+0

시험은 저를 위해 성공합니다. 게시 한 코드가 테스트 한 코드와 동일하다는 것을 확신합니까? –

+0

문제는 'IndexOf'가 문화권 관련 검색을 사용하고'Replace'가 서수 검색을 사용하는 것입니다. @Chris : 요점은 실패해야한다는 것입니다. –

답변

16

네, 전에 다른 문자로 나타났습니다. 기본적으로 IndexOf은 일치를 찾을 때 "특수"유니 코드 문자의 다양한 측면을 고려하지만 Replace은 문자열을 코드 포인트의 시퀀스로 처리하기 만합니다. IndexOf docs 가입일

:

이 방법은 현재 워드 배양을 이용하여 (대소 문자 구분 문화) 검색을 수행한다. 검색은이 인스턴스의 첫 번째 문자 위치에서 시작하여 마지막 문자 위치까지 계속됩니다.

... 및 Replace에서 :

이 방법은 서수 (대소 문자 구분하지 문화)가 oldValue입니다을 찾아 탐색을 수행한다.

당신은 StringComparison 소요 IndexOf의 오버로드를 사용하고 있지만 서수 비교를 수행하도록 강제 할 수있다.

+0

반사경을 확인한 후에는 기본적으로 StringComparison.CurrentCulture를 사용합니다. 매개 변수의 기본값을 피하기 위해 이미 배웠어야합니다. 고마워. 존. – ZFE

+0

[.Net Micro Framework의 String.IndexOf에 대한 설명서] (http://msdn.microsoft.com/en-us/library/hh400536.aspx)에도 검색은 " 민감한". 하지만 안타깝게도 netmf에는 System.StringComparison이 없으며이를 수용 할 수있는 String.IndexOf도 없습니다. – dumbledad

1

존이 말했듯이 StringComparison.Ordinal을 사용하면 올바르게 이해할 수 있습니다.

Assert.IsTrue(result.IndexOf(TWO_SPACES, StringComparison.Ordinal) < 0);