2010-04-01 2 views
5

많은 양의 텍스트를 생성하는 코드 조각에 대한 단위 테스트를 작성하려고합니다. "expected"및 "actual"문자열이 같지만 Assert.AreEqual이 발생하고 같음 연산자 및 Equals()이 모두 false를 반환하는 문제가 발생했습니다. GetHashCode()의 결과는 두 값에서 모두 다릅니다.C# 문자열 항등 연산자는 false를 반환하지만 사실이어야한다고 확신합니다 ... 뭐라고 요?

그러나 두 문자열을 모두 텍스트 파일에 넣고 DiffMerge와 비교해 보면 두 문자열이 동일하다는 것을 알 수 있습니다.

또한 Encoding.ASCII.GetBytes()을 두 값에 사용하고 SequenceEquals을 사용하여 결과 바이트 배열을 비교하면 true를 반환합니다.

값은 각각 34KB이므로 지금 여기에 넣지 않을 것입니다. 어떤 아이디어? 나는 완전히 비틀 거린다.

+2

'Encoding.Unicode.GetBytes()'를 시도해보십시오 - 동일한 동작입니까? –

+0

string.Equals (yourstring, StringComparison.InvariantCulture)는 무엇을 반환합니까? –

+0

단위 테스트 만 게시 할 수 있습니까? –

답변

5

DiffMerge에 공급할 파일의 인코딩 유형은 무엇입니까? 인코딩 유형과 일치하지 않는 문자가있는 경우 DiffMerge에 표시되지 않을 가능성이 있습니다.

생성되는 문자열과 예상되는 결과가 다른 문자 인코딩을 가지고있을 수 있습니다. ASCII.GetBytes을 수행하면 모든 것을 ASCII로 변환합니다. 따라서 문자열은 ASCII로 변환되고 ASCII 문자 집합과 동일합니다. 그러나 다른 문자 집합에서 여전히 같지 않을 수 있습니다 (여전히 "보입니다").

또한 string.Compare(str1, str2, StringComparison.XXXX)을 시도해보고 어떤 일이 발생했는지 알려주세요.

+0

아마도 'StringComparison.Ordinal'을 시도하는 것이 가장 좋습니다. –

+0

그래, 인코딩 문제 였어. 잘못된 텍스트가 웹 페이지에서 복사되어 미친 인용 문자가 있었어. –

10

~ char ~ char에 의해 루프가 다르다는 것을 알 수 있습니까? 디스크에 쓰고 ASCII/텍스트를 비교한다는 사실은 캐리지 리턴/줄 바꿈과 관련이 있거나 (예를 들어 저장하는 동안 어떻게 든 정상화 됨) ASCII가 아닌 일부 문자 (아마도 하이 - 유니 코드 공백), ASCII로 저장할 때 제거됩니다.

관련 문제